@highstate/backend 0.9.18 → 0.9.19

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 (331) hide show
  1. package/dist/chunk-5WVU2AK4.js +1535 -0
  2. package/dist/chunk-5WVU2AK4.js.map +1 -0
  3. package/dist/{chunk-OU5OQBLB.js → chunk-I7BWSAN6.js} +3 -28
  4. package/dist/{chunk-OU5OQBLB.js.map → chunk-I7BWSAN6.js.map} +1 -1
  5. package/dist/chunk-VB4YL327.js +139 -0
  6. package/dist/chunk-VB4YL327.js.map +1 -0
  7. package/dist/database/local/prisma.config.js +26 -0
  8. package/dist/database/local/prisma.config.js.map +1 -0
  9. package/dist/highstate.manifest.json +2 -1
  10. package/dist/index.js +7587 -7291
  11. package/dist/index.js.map +1 -1
  12. package/dist/library/package-resolution-worker.js +1 -1
  13. package/dist/library/package-resolution-worker.js.map +1 -1
  14. package/dist/library/worker/main.js +35 -29
  15. package/dist/library/worker/main.js.map +1 -1
  16. package/dist/shared/index.js +2 -2
  17. package/package.json +18 -9
  18. package/prisma/backend/_schema/layout.prisma +7 -0
  19. package/prisma/backend/_schema/library.prisma +17 -0
  20. package/prisma/backend/_schema/project.prisma +101 -0
  21. package/prisma/backend/_schema/pulumi.prisma +17 -0
  22. package/prisma/backend/postgresql/main.prisma +17 -0
  23. package/prisma/backend/sqlite/main.prisma +17 -0
  24. package/prisma/backend/sqlite/migrations/20250817070609_initiial/migration.sql +34 -0
  25. package/prisma/backend/sqlite/migrations/20250817104948_add_fields/migration.sql +59 -0
  26. package/prisma/backend/sqlite/migrations/20250818082732_add_models/migration.sql +41 -0
  27. package/prisma/backend/sqlite/migrations/20250818083106_a/migration.sql +19 -0
  28. package/prisma/backend/sqlite/migrations/20250818101945_hi/migration.sql +1 -0
  29. package/prisma/backend/sqlite/migrations/20250819082315_a/migration.sql +5 -0
  30. package/prisma/backend/sqlite/migrations/migration_lock.toml +3 -0
  31. package/prisma/project/api-key.prisma +27 -0
  32. package/prisma/project/artifact.prisma +52 -0
  33. package/prisma/project/custom-status.prisma +46 -0
  34. package/prisma/project/evaluation.prisma +35 -0
  35. package/prisma/project/instance.prisma +160 -0
  36. package/prisma/project/layout.prisma +23 -0
  37. package/prisma/project/lock.prisma +18 -0
  38. package/prisma/project/main.prisma +17 -0
  39. package/prisma/project/migrations/20250816081310_initial/migration.sql +300 -0
  40. package/prisma/project/migrations/20250816082523_test/migration.sql +72 -0
  41. package/prisma/project/migrations/20250818065643_update/migration.sql +42 -0
  42. package/prisma/project/migrations/20250818070758_a/migration.sql +8 -0
  43. package/prisma/project/migrations/20250818070913_a/migration.sql +8 -0
  44. package/prisma/project/migrations/20250818082720_add_motels/migration.sql +11 -0
  45. package/prisma/project/migrations/20250818112523_hello/migration.sql +35 -0
  46. package/prisma/project/migrations/20250819082305_a/migration.sql +14 -0
  47. package/prisma/project/migrations/20250819165004_add_missing_fields/migration.sql +216 -0
  48. package/prisma/project/migrations/20250819171309_a/migration.sql +22 -0
  49. package/prisma/project/migrations/20250820113949_a/migration.sql +66 -0
  50. package/prisma/project/migrations/20250820144256_b/migration.sql +31 -0
  51. package/prisma/project/migrations/20250820145547_a/migration.sql +24 -0
  52. package/prisma/project/migrations/20250820182517_b/migration.sql +2 -0
  53. package/prisma/project/migrations/20250821172324_a/migration.sql +2 -0
  54. package/prisma/project/migrations/20250822081339_a/migration.sql +219 -0
  55. package/prisma/project/migrations/20250822083742_b/migration.sql +1 -0
  56. package/prisma/project/migrations/20250822105134_boom/migration.sql +1 -0
  57. package/prisma/project/migrations/20250822141028_b/migration.sql +1 -0
  58. package/prisma/project/migrations/20250822142342_b/migration.sql +16 -0
  59. package/prisma/project/migrations/20250824072720_a/migration.sql +1 -0
  60. package/prisma/project/migrations/20250824093656_b/migration.sql +21 -0
  61. package/prisma/project/migrations/20250825082518_a/migration.sql +1 -0
  62. package/prisma/project/migrations/20250825085343_b/migration.sql +1 -0
  63. package/prisma/project/migrations/20250825091312_a/migration.sql +1 -0
  64. package/prisma/project/migrations/20250903095431_hi/migration.sql +44 -0
  65. package/prisma/project/migrations/20250903174255_a/migration.sql +24 -0
  66. package/prisma/project/migrations/20250908095205_hi/migration.sql +18 -0
  67. package/prisma/project/migrations/20250909155857_hi/migration.sql +15 -0
  68. package/prisma/project/migrations/migration_lock.toml +3 -0
  69. package/prisma/project/model.prisma +37 -0
  70. package/prisma/project/operation.prisma +148 -0
  71. package/prisma/project/page.prisma +41 -0
  72. package/prisma/project/secret.prisma +42 -0
  73. package/prisma/project/service-account.prisma +36 -0
  74. package/prisma/project/terminal.prisma +90 -0
  75. package/prisma/project/trigger.prisma +31 -0
  76. package/prisma/project/unlock-method.prisma +32 -0
  77. package/prisma/project/worker.prisma +138 -0
  78. package/src/artifact/abstractions.ts +13 -13
  79. package/src/artifact/encryption.ts +30 -54
  80. package/src/artifact/factory.ts +6 -9
  81. package/src/artifact/local.ts +33 -46
  82. package/src/business/api-key.ts +24 -36
  83. package/src/business/artifact.test.ts +978 -0
  84. package/src/business/artifact.ts +136 -216
  85. package/src/business/evaluation.ts +328 -0
  86. package/src/business/index.ts +5 -2
  87. package/src/business/instance-lock.test.ts +1060 -0
  88. package/src/business/instance-lock.ts +387 -78
  89. package/src/business/instance-state.test.ts +735 -0
  90. package/src/business/instance-state.ts +582 -337
  91. package/src/business/operation.test.ts +439 -0
  92. package/src/business/operation.ts +174 -208
  93. package/src/business/project-model.ts +258 -0
  94. package/src/business/project-unlock.ts +168 -126
  95. package/src/business/project.ts +287 -179
  96. package/src/business/secret.test.ts +465 -130
  97. package/src/business/secret.ts +186 -217
  98. package/src/business/settings.test.ts +695 -0
  99. package/src/business/settings.ts +855 -0
  100. package/src/business/terminal-session.ts +90 -0
  101. package/src/business/unit-extra.test.ts +539 -0
  102. package/src/business/unit-extra.ts +160 -0
  103. package/src/business/worker.test.ts +356 -579
  104. package/src/business/worker.ts +238 -339
  105. package/src/common/codebase.ts +65 -0
  106. package/src/common/index.ts +3 -5
  107. package/src/common/logger.ts +5 -0
  108. package/src/common/utils.ts +4 -3
  109. package/src/config.ts +10 -11
  110. package/src/database/_generated/backend/postgresql/client.ts +72 -0
  111. package/src/database/_generated/backend/postgresql/commonInputTypes.ts +350 -0
  112. package/src/database/_generated/backend/postgresql/enums.ts +13 -0
  113. package/src/database/_generated/backend/postgresql/internal/class.ts +320 -0
  114. package/src/database/_generated/backend/postgresql/internal/prismaNamespace.ts +1238 -0
  115. package/src/database/_generated/backend/postgresql/models/Library.ts +1263 -0
  116. package/src/database/_generated/backend/postgresql/models/Project.ts +2175 -0
  117. package/src/database/_generated/backend/postgresql/models/ProjectModelStorage.ts +1263 -0
  118. package/src/database/_generated/backend/postgresql/models/ProjectSpace.ts +1602 -0
  119. package/src/database/_generated/backend/postgresql/models/PulumiBackend.ts +1263 -0
  120. package/src/database/_generated/backend/postgresql/models/UserWorkspaseLayout.ts +1065 -0
  121. package/src/database/_generated/backend/postgresql/models.ts +16 -0
  122. package/src/database/_generated/backend/postgresql/pjtg.ts +182 -0
  123. package/src/database/_generated/backend/sqlite/client.ts +72 -0
  124. package/src/database/_generated/backend/sqlite/commonInputTypes.ts +331 -0
  125. package/src/database/_generated/backend/sqlite/enums.ts +13 -0
  126. package/src/database/_generated/backend/sqlite/internal/class.ts +318 -0
  127. package/src/database/_generated/backend/sqlite/internal/prismaNamespace.ts +1207 -0
  128. package/src/database/_generated/backend/sqlite/models/Library.ts +1261 -0
  129. package/src/database/_generated/backend/sqlite/models/Project.ts +2169 -0
  130. package/src/database/_generated/backend/sqlite/models/ProjectModelStorage.ts +1261 -0
  131. package/src/database/_generated/backend/sqlite/models/ProjectSpace.ts +1599 -0
  132. package/src/database/_generated/backend/sqlite/models/PulumiBackend.ts +1261 -0
  133. package/src/database/_generated/backend/sqlite/models/UserWorkspaseLayout.ts +1063 -0
  134. package/src/database/_generated/backend/sqlite/models.ts +16 -0
  135. package/src/database/_generated/backend/sqlite/pjtg.ts +182 -0
  136. package/src/database/_generated/project/client.ts +204 -0
  137. package/src/database/_generated/project/commonInputTypes.ts +827 -0
  138. package/src/database/_generated/project/enums.ts +104 -0
  139. package/src/database/_generated/project/internal/class.ts +479 -0
  140. package/src/database/_generated/project/internal/prismaNamespace.ts +2974 -0
  141. package/src/database/_generated/project/models/ApiKey.ts +1506 -0
  142. package/src/database/_generated/project/models/Artifact.ts +2051 -0
  143. package/src/database/_generated/project/models/HubModel.ts +1125 -0
  144. package/src/database/_generated/project/models/InstanceCustomStatus.ts +1713 -0
  145. package/src/database/_generated/project/models/InstanceEvaluationState.ts +1312 -0
  146. package/src/database/_generated/project/models/InstanceLock.ts +1268 -0
  147. package/src/database/_generated/project/models/InstanceModel.ts +1125 -0
  148. package/src/database/_generated/project/models/InstanceOperationState.ts +1707 -0
  149. package/src/database/_generated/project/models/InstanceState.ts +4613 -0
  150. package/src/database/_generated/project/models/Operation.ts +1647 -0
  151. package/src/database/_generated/project/models/OperationLog.ts +1455 -0
  152. package/src/database/_generated/project/models/Page.ts +1838 -0
  153. package/src/database/_generated/project/models/Secret.ts +1692 -0
  154. package/src/database/_generated/project/models/ServiceAccount.ts +2165 -0
  155. package/src/database/_generated/project/models/Terminal.ts +2038 -0
  156. package/src/database/_generated/project/models/TerminalSession.ts +1454 -0
  157. package/src/database/_generated/project/models/TerminalSessionLog.ts +1280 -0
  158. package/src/database/_generated/project/models/Trigger.ts +1430 -0
  159. package/src/database/_generated/project/models/UnlockMethod.ts +1220 -0
  160. package/src/database/_generated/project/models/UserCompositeViewport.ts +1280 -0
  161. package/src/database/_generated/project/models/UserProjectViewport.ts +1059 -0
  162. package/src/database/_generated/project/models/Worker.ts +1459 -0
  163. package/src/database/_generated/project/models/WorkerUnitRegistration.ts +1524 -0
  164. package/src/database/_generated/project/models/WorkerVersion.ts +1974 -0
  165. package/src/database/_generated/project/models/WorkerVersionLog.ts +1318 -0
  166. package/src/database/_generated/project/models.ts +35 -0
  167. package/src/database/_generated/project/pjtg.ts +182 -0
  168. package/src/database/abstractions.ts +19 -0
  169. package/src/database/factory.ts +37 -0
  170. package/src/database/index.ts +6 -0
  171. package/src/database/local/backend.ts +134 -0
  172. package/src/database/local/index.ts +3 -0
  173. package/src/database/local/meta.ts +46 -0
  174. package/src/database/local/prisma.config.ts +25 -0
  175. package/src/database/local/project.ts +39 -0
  176. package/src/database/manager.ts +181 -0
  177. package/src/database/migrate.ts +35 -0
  178. package/src/database/prisma.ts +56 -0
  179. package/src/database/well-known.ts +38 -0
  180. package/src/index.ts +4 -4
  181. package/src/library/abstractions.ts +3 -5
  182. package/src/library/factory.ts +1 -1
  183. package/src/library/local.ts +81 -26
  184. package/src/library/package-resolution-worker.ts +1 -1
  185. package/src/library/worker/evaluator.ts +40 -23
  186. package/src/library/worker/loader.lite.ts +1 -1
  187. package/src/library/worker/main.ts +3 -10
  188. package/src/library/worker/protocol.ts +0 -1
  189. package/src/lock/index.ts +0 -1
  190. package/src/lock/manager.ts +0 -10
  191. package/src/orchestrator/manager.ts +190 -104
  192. package/src/orchestrator/operation-context.ts +357 -0
  193. package/src/orchestrator/operation-plan.destroy.test.md +357 -0
  194. package/src/orchestrator/operation-plan.destroy.test.ts +775 -0
  195. package/src/orchestrator/operation-plan.fixtures.ts +213 -0
  196. package/src/orchestrator/operation-plan.md +198 -0
  197. package/src/orchestrator/operation-plan.refresh.test.md +199 -0
  198. package/src/orchestrator/operation-plan.refresh.test.ts +367 -0
  199. package/src/orchestrator/operation-plan.ts +709 -0
  200. package/src/orchestrator/operation-plan.update.test.md +485 -0
  201. package/src/orchestrator/operation-plan.update.test.ts +1066 -0
  202. package/src/orchestrator/operation-workset.ts +233 -578
  203. package/src/orchestrator/operation.ts +435 -948
  204. package/src/orchestrator/plan-test-builder.ts +267 -0
  205. package/src/project-model/abstractions.ts +118 -0
  206. package/src/project-model/backends/codebase.ts +365 -0
  207. package/src/project-model/backends/database.ts +440 -0
  208. package/src/project-model/errors.ts +81 -0
  209. package/src/project-model/factory.ts +24 -0
  210. package/src/project-model/index.ts +4 -0
  211. package/src/project-model/utils.test.ts +544 -0
  212. package/src/project-model/utils.ts +242 -0
  213. package/src/pubsub/abstractions.ts +10 -1
  214. package/src/pubsub/factory.ts +4 -4
  215. package/src/pubsub/index.ts +1 -0
  216. package/src/pubsub/manager.ts +29 -13
  217. package/src/pubsub/memory.ts +31 -0
  218. package/src/runner/abstractions.ts +33 -41
  219. package/src/runner/artifact-env.ts +19 -8
  220. package/src/runner/factory.ts +6 -6
  221. package/src/runner/force-abort.ts +3 -6
  222. package/src/runner/local.ts +64 -67
  223. package/src/runner/pulumi.ts +23 -63
  224. package/src/services.ts +181 -123
  225. package/src/shared/models/backend/index.ts +3 -1
  226. package/src/shared/models/backend/library.ts +9 -1
  227. package/src/shared/models/backend/project.ts +43 -42
  228. package/src/shared/models/backend/pulumi.ts +14 -0
  229. package/src/shared/models/backend/unlock-method.ts +1 -1
  230. package/src/shared/models/backend/well-known.ts +58 -0
  231. package/src/shared/models/base.ts +40 -26
  232. package/src/shared/models/errors.ts +82 -1
  233. package/src/shared/models/index.ts +3 -2
  234. package/src/shared/models/prisma.ts +36 -0
  235. package/src/shared/models/project/api-key.ts +37 -59
  236. package/src/shared/models/project/artifact.ts +16 -76
  237. package/src/shared/models/project/custom-status.ts +12 -0
  238. package/src/shared/models/project/index.ts +8 -7
  239. package/src/shared/models/project/lock.ts +10 -78
  240. package/src/shared/models/project/model.ts +19 -1
  241. package/src/shared/models/project/operation.ts +222 -99
  242. package/src/shared/models/project/page.ts +37 -48
  243. package/src/shared/models/project/secret.ts +29 -89
  244. package/src/shared/models/project/service-account.ts +12 -17
  245. package/src/shared/models/project/state.ts +100 -407
  246. package/src/shared/models/project/terminal.ts +75 -88
  247. package/src/shared/models/project/trigger.ts +13 -49
  248. package/src/shared/models/project/unlock-method.ts +20 -26
  249. package/src/shared/models/project/worker.ts +89 -90
  250. package/src/shared/resolvers/graph-resolver.ts +21 -0
  251. package/src/shared/resolvers/index.ts +1 -1
  252. package/src/shared/resolvers/input-hash.ts +24 -14
  253. package/src/shared/resolvers/input.ts +1 -1
  254. package/src/shared/resolvers/registry.ts +5 -4
  255. package/src/shared/resolvers/state.ts +12 -1
  256. package/src/shared/resolvers/validation.ts +7 -3
  257. package/src/shared/utils/index.ts +1 -2
  258. package/src/shared/utils/promise-tracker.ts +30 -3
  259. package/src/terminal/abstractions.ts +1 -1
  260. package/src/terminal/docker.ts +3 -3
  261. package/src/terminal/manager.ts +102 -118
  262. package/src/test-utils/database.ts +119 -0
  263. package/src/test-utils/index.ts +2 -0
  264. package/src/test-utils/services.ts +134 -0
  265. package/src/unlock/abstractions.ts +5 -23
  266. package/src/unlock/memory.ts +9 -14
  267. package/src/worker/abstractions.ts +7 -4
  268. package/src/worker/docker.ts +14 -19
  269. package/src/worker/manager.ts +366 -97
  270. package/dist/chunk-NAAIDR4U.js +0 -8499
  271. package/dist/chunk-NAAIDR4U.js.map +0 -1
  272. package/dist/chunk-Y7DXREVO.js +0 -1745
  273. package/dist/chunk-Y7DXREVO.js.map +0 -1
  274. package/dist/magic-string.es-5ABAC4JN.js +0 -1292
  275. package/dist/magic-string.es-5ABAC4JN.js.map +0 -1
  276. package/src/business/__traces__/secret/update-instance-secrets/create-and-delete-secrets-simultaneously.md +0 -356
  277. package/src/business/__traces__/secret/update-instance-secrets/create-new-secrets-for-instance.md +0 -274
  278. package/src/business/__traces__/secret/update-instance-secrets/delete-existing-secrets.md +0 -223
  279. package/src/business/__traces__/secret/update-instance-secrets/no-op-when-no-changes.md +0 -147
  280. package/src/business/__traces__/secret/update-instance-secrets/update-existing-secrets.md +0 -280
  281. package/src/business/__traces__/worker/update-unit-registrations/add-new-unit-registration-when-other-exists.md +0 -360
  282. package/src/business/__traces__/worker/update-unit-registrations/add-new-unit-registration.md +0 -215
  283. package/src/business/__traces__/worker/update-unit-registrations/create-multiple-workers-with-different-identities.md +0 -427
  284. package/src/business/__traces__/worker/update-unit-registrations/handle-nonexistent-registration-id-gracefully.md +0 -217
  285. package/src/business/__traces__/worker/update-unit-registrations/no-op-when-no-changes.md +0 -132
  286. package/src/business/__traces__/worker/update-unit-registrations/recreate-worker-when-image-changes.md +0 -454
  287. package/src/business/__traces__/worker/update-unit-registrations/recreate-worker-when-image-version-changes.md +0 -426
  288. package/src/business/__traces__/worker/update-unit-registrations/recreate-worker-with-same-identity-reuses-service-account.md +0 -372
  289. package/src/business/__traces__/worker/update-unit-registrations/remove-one-of-multiple-unit-registrations.md +0 -383
  290. package/src/business/__traces__/worker/update-unit-registrations/remove-unit-registration.md +0 -245
  291. package/src/business/__traces__/worker/update-unit-registrations/update-existing-unit-registration-when-params-change.md +0 -174
  292. package/src/business/__traces__/worker/update-unit-registrations/update-params-and-image-simultaneously.md +0 -432
  293. package/src/business/__traces__/worker/update-unit-registrations/worker-with-multiple-registrations-not-deleted-when-one-removed.md +0 -220
  294. package/src/business/backend-unlock.ts +0 -10
  295. package/src/common/clock.ts +0 -18
  296. package/src/common/performance.ts +0 -44
  297. package/src/common/random.ts +0 -68
  298. package/src/common/test/index.ts +0 -2
  299. package/src/common/test/render.ts +0 -98
  300. package/src/common/test/tracer.ts +0 -359
  301. package/src/hotstate/abstractions.ts +0 -48
  302. package/src/hotstate/factory.ts +0 -17
  303. package/src/hotstate/index.ts +0 -3
  304. package/src/hotstate/manager.ts +0 -192
  305. package/src/hotstate/memory.ts +0 -100
  306. package/src/hotstate/validation.ts +0 -100
  307. package/src/lock/test.ts +0 -108
  308. package/src/project/abstractions.ts +0 -78
  309. package/src/project/evaluation.ts +0 -248
  310. package/src/project/factory.ts +0 -11
  311. package/src/project/index.ts +0 -3
  312. package/src/project/local.ts +0 -417
  313. package/src/pubsub/local.ts +0 -36
  314. package/src/pubsub/validation.ts +0 -33
  315. package/src/shared/utils/args.ts +0 -25
  316. package/src/state/abstractions.ts +0 -289
  317. package/src/state/encryption.ts +0 -98
  318. package/src/state/factory.ts +0 -20
  319. package/src/state/index.ts +0 -7
  320. package/src/state/local/backend.ts +0 -106
  321. package/src/state/local/collection.ts +0 -361
  322. package/src/state/local/index.ts +0 -2
  323. package/src/state/manager.ts +0 -890
  324. package/src/state/memory/backend.ts +0 -70
  325. package/src/state/memory/collection.ts +0 -270
  326. package/src/state/memory/index.ts +0 -2
  327. package/src/state/repository/index.ts +0 -2
  328. package/src/state/repository/repository.index.ts +0 -193
  329. package/src/state/repository/repository.ts +0 -507
  330. package/src/state/test.ts +0 -457
  331. /package/src/{state → database/local}/keyring.ts +0 -0
@@ -0,0 +1,485 @@
1
+ # Update Phase Examples
2
+
3
+ **Legend:**
4
+
5
+ - `✅` = Up-to-date instance
6
+ - `≠` = Out-of-date instance
7
+ - `∅` = Non-deployed instance
8
+ - `❌` = Error instance
9
+ - `🚀` = Explicitly requested instance
10
+ - `👻` = Ghost instance (virtual)
11
+
12
+ ### Example 1: Simple Dependency Chain
13
+
14
+ **Test**: `should include out-of-date dependencies in linear chain`
15
+
16
+ ```mermaid
17
+ graph RL
18
+ A["A ✅"]
19
+ B["B ≠"]
20
+ C["C 🚀"]
21
+
22
+ C --> B --> A
23
+ ```
24
+
25
+ **Decision Steps**:
26
+
27
+ 1. `C` explicitly requested;
28
+ 2. `C` depends on `B`, `B` is outdated → `B` included;
29
+ 3. `B` depends on `A`, `A` is up-to-date → `A` excluded.
30
+
31
+ **Update Phase**: `B`, `C`
32
+
33
+ ### Example 2: Composite Boundary Isolation
34
+
35
+ **Test**: `should not propagate beyond compositional inclusion`
36
+
37
+ ```mermaid
38
+ graph RL
39
+ subgraph GrandParent
40
+ subgraph Parent
41
+ A["A ≠"]
42
+ end
43
+ B["B 🚀"]
44
+ C["C ≠"]
45
+ end
46
+
47
+ B --> A
48
+ ```
49
+
50
+ **Decision Steps**:
51
+
52
+ 1. `B` explicitly requested;
53
+ 2. `B` depends on `A`, `A` is outdated → `A` included;
54
+ 3. `A` is child of `Parent` → `Parent` included (compositional);
55
+ 4. `Parent` is child of `GrandParent` → `GrandParent` NOT included (compositional boundary);
56
+ 5. `C` is sibling of `Parent`, `C` is outdated but `GrandParent` is not included → `C` NOT included.
57
+
58
+ **Update Phase**: `A`, `Parent`, `B`
59
+
60
+ ### Example 3: Force Dependencies
61
+
62
+ **Test**: `should force all dependencies when flag enabled`
63
+
64
+ ```mermaid
65
+ graph RL
66
+ A["A ✅"]
67
+ B["B ✅"]
68
+ C["C 🚀"]
69
+
70
+ C --> B --> A
71
+ ```
72
+
73
+ **Options:**
74
+
75
+ - `forceUpdateDependencies`: `true`
76
+
77
+ **Decision Steps**:
78
+
79
+ 1. `C` explicitly requested;
80
+ 2. `C` depends on `B`, force flag enabled → `B` included;
81
+ 3. `B` depends on `A`, force flag enabled → `A` included.
82
+
83
+ **Update Phase**: `A`, `B`, `C`
84
+
85
+ ### Example 4: Substantive Composite with Mixed Child States
86
+
87
+ **Test**: `should include outdated children of substantive composite`
88
+
89
+ ```mermaid
90
+ graph RL
91
+ subgraph Parent["Parent 🚀"]
92
+ Child1["Child1 ≠"]
93
+ Child2["Child2 ∅"]
94
+ Child3["Child3 ✅"]
95
+ end
96
+ ```
97
+
98
+ **Decision Steps**:
99
+
100
+ 1. `Parent` explicitly requested (substantive composite);
101
+ 2. `Child1` is child of substantive composite, outdated → `Child1` included;
102
+ 3. `Child2` is child of substantive composite, outdated → `Child2` included;
103
+ 4. `Child3` is child of substantive composite, up-to-date → `Child3` excluded.
104
+
105
+ **Update Phase**: `Child1`, `Child2`, `Parent`
106
+
107
+ ### Example 5: Ghost Cleanup During Update
108
+
109
+ **Test**: `should cleanup ghost children during composite update`
110
+
111
+ ```mermaid
112
+ graph RL
113
+ subgraph Parent["Parent 🚀"]
114
+ Child1["Child1 ✅"]
115
+ GhostChild["GhostChild 👻"]
116
+ end
117
+ ```
118
+
119
+ **Decision Steps**:
120
+
121
+ 1. `Parent` explicitly requested (substantive composite), but will not be added to update phase as all real children are up-to-date;
122
+ 2. `GhostChild` is ghost child of `Parent` → `GhostChild` added to destroy phase;
123
+ 3. `Parent` has destroyed children → `Parent` added to destroy phase.
124
+
125
+ **Destroy Phase**: `GhostChild`, `Parent`
126
+
127
+ ### Example 6: Nested Composites with Mixed Updates
128
+
129
+ **Test**: `should handle complex nested hierarchy correctly`
130
+
131
+ ```mermaid
132
+ graph RL
133
+ subgraph GrandParent["GrandParent 🚀"]
134
+ subgraph Parent1
135
+ Child1["Child1 ≠"]
136
+ Child2["Child2 ✅"]
137
+ end
138
+ subgraph Parent2
139
+ Child3["Child3 ✅"]
140
+ end
141
+ end
142
+
143
+ Child1 --> Child3
144
+ ```
145
+
146
+ **Decision Steps**:
147
+
148
+ 1. `GrandParent` explicitly requested (substantive composite);
149
+ 2. `Child1` is child of substantive composite, outdated → `Child1` included;
150
+ 3. `Child1` depends on `Child3`, `Child3` up-to-date → `Child3` excluded;
151
+ 4. `Child1` is child of `Parent1` → `Parent1` included (compositional);
152
+ 5. `Parent1` is child of `GrandParent` → already included.
153
+
154
+ **Update Phase**: `Child1`, `Parent1`, `GrandParent`
155
+
156
+ ### Example 7: Request Child with Isolated Update
157
+
158
+ **Test**: `should not include siblings when child explicitly requested (isolated update)`
159
+
160
+ ```mermaid
161
+ graph RL
162
+ subgraph Parent
163
+ Child1["Child1 🚀"]
164
+ Child2["Child2 ∅"]
165
+ Child3["Child3 ✅"]
166
+ end
167
+ ```
168
+
169
+ **Decision Steps**:
170
+
171
+ 1. `Child1` explicitly requested;
172
+ 2. `Child1` is child of `Parent` → `Parent` included (compositional);
173
+ 3. `Child2` is child of compositional composite → `Child2` NOT included (rule 3 doesn't apply);
174
+ 4. `Child3` is child of compositional composite → `Child3` NOT included (rule 3 doesn't apply).
175
+
176
+ **Update Phase**: `Child1`, `Parent`
177
+
178
+ ### Example 8: Force Children Flag
179
+
180
+ **Test**: `should force all children when flag enabled`
181
+
182
+ ```mermaid
183
+ graph RL
184
+ subgraph Parent["Parent 🚀"]
185
+ Child1["Child1 ≠"]
186
+ Child2["Child2 ∅"]
187
+ Child3["Child3 ✅"]
188
+ end
189
+ ```
190
+
191
+ **Options:**
192
+
193
+ - `forceUpdateChildren`: `true`
194
+
195
+ **Decision Steps**:
196
+
197
+ 1. `Parent` explicitly requested (substantive composite);
198
+ 2. `Child1` is child of substantive composite, force children enabled → `Child1` included;
199
+ 3. `Child2` is child of substantive composite, force children enabled → `Child2` included;
200
+ 4. `Child3` is child of substantive composite, force children enabled → `Child3` included.
201
+
202
+ **Update Phase**: `Child1`, `Child2`, `Child3`, `Parent`
203
+
204
+ ### Example 9: Error State Recovery
205
+
206
+ **Test**: `should include instances with error status for recovery`
207
+
208
+ ```mermaid
209
+ graph RL
210
+ A["A ✅"]
211
+ B["B ❌"]
212
+ C["C 🚀"]
213
+
214
+ C --> B --> A
215
+ ```
216
+
217
+ **Decision Steps**:
218
+
219
+ 1. `C` explicitly requested;
220
+ 2. `C` depends on `B`, `B` is outdated (failed) → `B` included;
221
+ 3. `B` depends on `A`, `A` is up-to-date → `A` excluded.
222
+
223
+ **Update Phase**: `B`, `C`
224
+
225
+ ### Example 10: Cross-Composite Dependencies
226
+
227
+ **Test**: `should handle dependencies crossing composite boundaries`
228
+
229
+ ```mermaid
230
+ graph RL
231
+ subgraph CompositeA
232
+ ChildA["ChildA ≠"]
233
+ end
234
+ subgraph CompositeB
235
+ ChildB["ChildB 🚀"]
236
+ end
237
+
238
+ ChildB --> ChildA
239
+ ```
240
+
241
+ **Decision Steps**:
242
+
243
+ 1. `ChildB` explicitly requested;
244
+ 2. `ChildB` depends on `ChildA`, `ChildA` is outdated → `ChildA` included;
245
+ 3. `ChildB` is child of `CompositeB` → `CompositeB` included (compositional);
246
+ 4. `ChildA` is child of `CompositeA`, included due to external dependency → `CompositeA` included (substantive).
247
+
248
+ **Update Phase**: `ChildA`, `CompositeA`, `ChildB`, `CompositeB`
249
+
250
+ ### Example 11: Unrelated Instance Isolation
251
+
252
+ **Test**: `should not include unrelated instances even if they depend on updated instance`
253
+
254
+ ```mermaid
255
+ graph RL
256
+ subgraph Parent["Parent ✅"]
257
+ Child1["Child1 ≠"]
258
+ Child2["Child2 ✅"]
259
+ end
260
+ ExternalX["ExternalX ≠ 🚀"]
261
+
262
+ Child1 --> ExternalX
263
+ ```
264
+
265
+ **Decision Steps**:
266
+
267
+ 1. `ExternalX` explicitly requested;
268
+ 2. no instances depend on `ExternalX` (`Child1` depends on `ExternalX`, not vice versa);
269
+ 3. `Child1` is not explicitly requested, not a dependency of `ExternalX`, not a child of substantive composite;
270
+ 4. `Parent` and its children remain unaffected.
271
+
272
+ **Update Phase**: `ExternalX`
273
+
274
+ ### Example 12: Multiple Explicit Requests
275
+
276
+ **Test**: `should handle multiple explicit requests with overlapping dependencies`
277
+
278
+ ```mermaid
279
+ graph RL
280
+ A["A 🚀"]
281
+ B["B ✅"]
282
+ C["C 🚀"]
283
+
284
+ C --> B --> A
285
+ ```
286
+
287
+ **Decision Steps**:
288
+
289
+ 1. `A` explicitly requested;
290
+ 2. `C` explicitly requested;
291
+ 3. `C` depends on `B`, `B` is up-to-date → `B` excluded;
292
+ 4. `B` depends on `A`, `A` already included → no change.
293
+
294
+ **Update Phase**: `A`, `C`
295
+
296
+ ### Example 13: Deep Nesting with Boundary Isolation
297
+
298
+ **Test**: `should isolate boundaries in deep composite hierarchies`
299
+
300
+ ```mermaid
301
+ graph RL
302
+ subgraph GreatGrandParent
303
+ subgraph GrandParent
304
+ subgraph Parent
305
+ Child["Child 🚀"]
306
+ end
307
+ Uncle["Uncle ✅"]
308
+ end
309
+ GreatUncle["GreatUncle ✅"]
310
+ end
311
+ ```
312
+
313
+ **Decision Steps**:
314
+
315
+ 1. `Child` explicitly requested;
316
+ 2. `Child` is child of `Parent` → `Parent` included (compositional);
317
+ 3. `Parent` is child of `GrandParent` → `GrandParent` NOT included (compositional boundary);
318
+ 4. `Uncle` and `GreatUncle` not affected.
319
+
320
+ **Update Phase**: `Child`, `Parent`
321
+
322
+ ### Example 14: Mixed Force Flags
323
+
324
+ **Test**: `should handle both force flags enabled together`
325
+
326
+ ```mermaid
327
+ graph RL
328
+ A["A ✅"]
329
+ B["B ✅"]
330
+ C["C 🚀"]
331
+ subgraph Parent["Parent ✅"]
332
+ Child1["Child1 ✅"]
333
+ Child2["Child2 ✅"]
334
+ end
335
+
336
+ C --> B --> A
337
+ C --> Child1
338
+ ```
339
+
340
+ **Options:**
341
+
342
+ - `forceUpdateDependencies`: `true`
343
+ - `forceUpdateChildren`: `true`
344
+
345
+ **Decision Steps**:
346
+
347
+ 1. `C` explicitly requested;
348
+ 2. `C` depends on `B`, force dependencies enabled → `B` included;
349
+ 3. `B` depends on `A`, force dependencies enabled → `A` included;
350
+ 4. `C` depends on `Child1`, force dependencies enabled → `Child1` included;
351
+ 5. `Child1` is child of `Parent` → `Parent` becomes substantive composite (has child included due to external dependency);
352
+ 6. `Child2` is child of substantive composite, force children enabled → `Child2` included.
353
+
354
+ **Update Phase**: `A`, `B`, `Child1`, `Child2`, `Parent`, `C`
355
+
356
+ ### Example 15: Diamond Dependency Pattern
357
+
358
+ **Test**: `should handle diamond dependency correctly`
359
+
360
+ ```mermaid
361
+ graph RL
362
+ A["A ✅"]
363
+ B["B ≠"]
364
+ C["C ≠"]
365
+ D["D 🚀"]
366
+
367
+ D --> B
368
+ D --> C
369
+ B --> A
370
+ C --> A
371
+ ```
372
+
373
+ **Decision Steps**:
374
+
375
+ 1. `D` explicitly requested;
376
+ 2. `D` depends on `B`, `B` is outdated → `B` included;
377
+ 3. `D` depends on `C`, `C` is outdated → `C` included;
378
+ 4. `B` depends on `A`, `A` is up-to-date → `A` excluded;
379
+ 5. `C` depends on `A`, `A` is up-to-date → `A` excluded (already evaluated).
380
+
381
+ **Update Phase**: `B`, `C`, `D`
382
+
383
+ ### Example 16: Mixed Ghost and Real Children
384
+
385
+ **Test**: `should handle composite with both ghost and real children`
386
+
387
+ ```mermaid
388
+ graph RL
389
+ subgraph Parent["Parent 🚀"]
390
+ Child1["Child1 ≠"]
391
+ Child2["Child2 ✅"]
392
+ GhostChild["GhostChild 👻"]
393
+ end
394
+ ```
395
+
396
+ **Decision Steps**:
397
+
398
+ 1. `Parent` explicitly requested (substantive composite);
399
+ 2. `Child1` is child of substantive composite, outdated → `Child1` included;
400
+ 3. `Child2` is child of substantive composite, up-to-date → `Child2` excluded;
401
+ 4. `GhostChild` is ghost child of `Parent` → `GhostChild` added to destroy phase;
402
+ 5. `Parent` has destroyed children → `Parent` added to destroy phase.
403
+
404
+ **Update Phase**: `Child1`, `Parent`
405
+
406
+ **Destroy Phase**: `GhostChild`, `Parent`
407
+
408
+ ### Example 17: Dependency Chain with Partial Update Disabled
409
+
410
+ **Test**: `should include dependency chain and force siblings when partial update disabled`
411
+
412
+ ```mermaid
413
+ graph RL
414
+ subgraph Parent["Parent ✅"]
415
+ Child1["Child1 ≠"]
416
+ Child2["Child2 ≠"]
417
+ end
418
+ ExternalX["ExternalX 🚀"]
419
+
420
+ ExternalX --> Child1
421
+ ```
422
+
423
+ **Decision Steps**:
424
+
425
+ 1. `ExternalX` explicitly requested;
426
+ 2. `ExternalX` depends on `Child1`, `Child1` is outdated → `Child1` included;
427
+ 3. `Parent` has child included due to external dependency, so `Parent` becomes substantive composite;
428
+ 4. `Child2` is child of substantive composite, outdated and partial update disabled → `Child2` included.
429
+
430
+ **Update Phase**: `Child1`, `Child2`, `Parent`, `ExternalX`
431
+
432
+ ### Example 18: Dependency Chain with Partial Update Enabled
433
+
434
+ **Test**: `should include dependency chain without forcing siblings when partial update enabled`
435
+
436
+ ```mermaid
437
+ graph RL
438
+ subgraph Parent["Parent ✅"]
439
+ Child1["Child1 ≠"]
440
+ Child2["Child2 ≠"]
441
+ end
442
+ ExternalX["ExternalX 🚀"]
443
+
444
+ ExternalX --> Child1
445
+ ```
446
+
447
+ **Options:**
448
+
449
+ - `allowPartialCompositeInstanceUpdate`: `true`
450
+
451
+ **Decision Steps**:
452
+
453
+ 1. `ExternalX` explicitly requested;
454
+ 2. `ExternalX` depends on `Child1`, `Child1` is outdated → `Child1` included;
455
+ 3. `Parent` has child included due to external dependency, so `Parent` becomes substantive composite;
456
+ 4. `Child2` is child of substantive composite, outdated but partial update enabled → `Child2` excluded.
457
+
458
+ **Update Phase**: `Child1`, `Parent`, `ExternalX`
459
+
460
+ ### Example 19: Child Dependencies with Compositional Parent
461
+
462
+ **Test**: `should include child dependencies when child explicitly requested`
463
+
464
+ ```mermaid
465
+ graph RL
466
+ subgraph Parent
467
+ Child1["Child1 ≠"]
468
+ Child2["Child2 🚀≠"]
469
+ Child3["Child3 ≠"]
470
+ Child4["Child4 ≠"]
471
+ end
472
+
473
+ Child2 --> Child1
474
+ Child3 --> Child4
475
+ ```
476
+
477
+ **Decision Steps**:
478
+
479
+ 1. `Child2` explicitly requested (outdated);
480
+ 2. `Child2` depends on `Child1`, `Child1` is outdated → `Child1` included;
481
+ 3. `Child2` is child of `Parent` → `Parent` included (compositional, since `Child1` is internal dependency);
482
+ 4. `Child3` is child of compositional composite, outdated → `Child3` excluded (rule 3 doesn't apply);
483
+ 5. `Child4` is child of compositional composite, outdated → `Child4` excluded (rule 3 doesn't apply).
484
+
485
+ **Update Phase**: `Child1`, `Child2`, `Parent`