Merge branch 'jennis/add_project_to_proto' into 'master'

Cache key calculation changes: add project name and name of dependencies

See merge request BuildStream/buildstream!1548
diff --git a/NEWS b/NEWS
index 88cc860..b47a700 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,13 @@
 buildstream 1.3.1
 =================
 
+  o BREAKING CHANGE: The project name of dependencies have been included when
+    calculating the cache key. This was required to keep inline with the
+    artifact proto. Additionally, for strict mode, the name of dependencies have
+    also been included in the calculation of the cache key. This is again to
+    keep inline with the proto, but also to maintain symmetry in the behaviour
+    between the strict and non-strict modes.
+
   o Added `bst artifact list-contents` subcommand which can display the names
     of files in artifacts in your artifact cache, either by element name
     or by direct artifact reference.
diff --git a/src/buildstream/_artifact.py b/src/buildstream/_artifact.py
index ff5bae4..05d0254 100644
--- a/src/buildstream/_artifact.py
+++ b/src/buildstream/_artifact.py
@@ -170,6 +170,7 @@
         # store build dependencies
         for e in element.dependencies(Scope.BUILD):
             new_build = artifact.build_deps.add()
+            new_build.project_name = e.project_name
             new_build.element_name = e.name
             new_build.cache_key = e._get_cache_key()
             new_build.was_workspaced = bool(e._get_workspace())
diff --git a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
index 86a2696..ac42b7b 100644
--- a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
+++ b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
@@ -2190,326 +2190,326 @@
 DESCRIPTOR.enum_types_by_name['DigestFunction'] = _DIGESTFUNCTION
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-Action = _reflection.GeneratedProtocolMessageType('Action', (_message.Message,), dict(
-  DESCRIPTOR = _ACTION,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+Action = _reflection.GeneratedProtocolMessageType('Action', (_message.Message,), {
+  'DESCRIPTOR' : _ACTION,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Action)
-  ))
+  })
 _sym_db.RegisterMessage(Action)
 
-Command = _reflection.GeneratedProtocolMessageType('Command', (_message.Message,), dict(
+Command = _reflection.GeneratedProtocolMessageType('Command', (_message.Message,), {
 
-  EnvironmentVariable = _reflection.GeneratedProtocolMessageType('EnvironmentVariable', (_message.Message,), dict(
-    DESCRIPTOR = _COMMAND_ENVIRONMENTVARIABLE,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'EnvironmentVariable' : _reflection.GeneratedProtocolMessageType('EnvironmentVariable', (_message.Message,), {
+    'DESCRIPTOR' : _COMMAND_ENVIRONMENTVARIABLE,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Command.EnvironmentVariable)
-    ))
+    })
   ,
-  DESCRIPTOR = _COMMAND,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _COMMAND,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Command)
-  ))
+  })
 _sym_db.RegisterMessage(Command)
 _sym_db.RegisterMessage(Command.EnvironmentVariable)
 
-Platform = _reflection.GeneratedProtocolMessageType('Platform', (_message.Message,), dict(
+Platform = _reflection.GeneratedProtocolMessageType('Platform', (_message.Message,), {
 
-  Property = _reflection.GeneratedProtocolMessageType('Property', (_message.Message,), dict(
-    DESCRIPTOR = _PLATFORM_PROPERTY,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'Property' : _reflection.GeneratedProtocolMessageType('Property', (_message.Message,), {
+    'DESCRIPTOR' : _PLATFORM_PROPERTY,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Platform.Property)
-    ))
+    })
   ,
-  DESCRIPTOR = _PLATFORM,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _PLATFORM,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Platform)
-  ))
+  })
 _sym_db.RegisterMessage(Platform)
 _sym_db.RegisterMessage(Platform.Property)
 
-Directory = _reflection.GeneratedProtocolMessageType('Directory', (_message.Message,), dict(
-  DESCRIPTOR = _DIRECTORY,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+Directory = _reflection.GeneratedProtocolMessageType('Directory', (_message.Message,), {
+  'DESCRIPTOR' : _DIRECTORY,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Directory)
-  ))
+  })
 _sym_db.RegisterMessage(Directory)
 
-FileNode = _reflection.GeneratedProtocolMessageType('FileNode', (_message.Message,), dict(
-  DESCRIPTOR = _FILENODE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+FileNode = _reflection.GeneratedProtocolMessageType('FileNode', (_message.Message,), {
+  'DESCRIPTOR' : _FILENODE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.FileNode)
-  ))
+  })
 _sym_db.RegisterMessage(FileNode)
 
-DirectoryNode = _reflection.GeneratedProtocolMessageType('DirectoryNode', (_message.Message,), dict(
-  DESCRIPTOR = _DIRECTORYNODE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+DirectoryNode = _reflection.GeneratedProtocolMessageType('DirectoryNode', (_message.Message,), {
+  'DESCRIPTOR' : _DIRECTORYNODE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.DirectoryNode)
-  ))
+  })
 _sym_db.RegisterMessage(DirectoryNode)
 
-SymlinkNode = _reflection.GeneratedProtocolMessageType('SymlinkNode', (_message.Message,), dict(
-  DESCRIPTOR = _SYMLINKNODE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+SymlinkNode = _reflection.GeneratedProtocolMessageType('SymlinkNode', (_message.Message,), {
+  'DESCRIPTOR' : _SYMLINKNODE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.SymlinkNode)
-  ))
+  })
 _sym_db.RegisterMessage(SymlinkNode)
 
-Digest = _reflection.GeneratedProtocolMessageType('Digest', (_message.Message,), dict(
-  DESCRIPTOR = _DIGEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+Digest = _reflection.GeneratedProtocolMessageType('Digest', (_message.Message,), {
+  'DESCRIPTOR' : _DIGEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Digest)
-  ))
+  })
 _sym_db.RegisterMessage(Digest)
 
-ExecutedActionMetadata = _reflection.GeneratedProtocolMessageType('ExecutedActionMetadata', (_message.Message,), dict(
-  DESCRIPTOR = _EXECUTEDACTIONMETADATA,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ExecutedActionMetadata = _reflection.GeneratedProtocolMessageType('ExecutedActionMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _EXECUTEDACTIONMETADATA,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecutedActionMetadata)
-  ))
+  })
 _sym_db.RegisterMessage(ExecutedActionMetadata)
 
-ActionResult = _reflection.GeneratedProtocolMessageType('ActionResult', (_message.Message,), dict(
-  DESCRIPTOR = _ACTIONRESULT,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ActionResult = _reflection.GeneratedProtocolMessageType('ActionResult', (_message.Message,), {
+  'DESCRIPTOR' : _ACTIONRESULT,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ActionResult)
-  ))
+  })
 _sym_db.RegisterMessage(ActionResult)
 
-OutputFile = _reflection.GeneratedProtocolMessageType('OutputFile', (_message.Message,), dict(
-  DESCRIPTOR = _OUTPUTFILE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+OutputFile = _reflection.GeneratedProtocolMessageType('OutputFile', (_message.Message,), {
+  'DESCRIPTOR' : _OUTPUTFILE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.OutputFile)
-  ))
+  })
 _sym_db.RegisterMessage(OutputFile)
 
-Tree = _reflection.GeneratedProtocolMessageType('Tree', (_message.Message,), dict(
-  DESCRIPTOR = _TREE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+Tree = _reflection.GeneratedProtocolMessageType('Tree', (_message.Message,), {
+  'DESCRIPTOR' : _TREE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.Tree)
-  ))
+  })
 _sym_db.RegisterMessage(Tree)
 
-OutputDirectory = _reflection.GeneratedProtocolMessageType('OutputDirectory', (_message.Message,), dict(
-  DESCRIPTOR = _OUTPUTDIRECTORY,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+OutputDirectory = _reflection.GeneratedProtocolMessageType('OutputDirectory', (_message.Message,), {
+  'DESCRIPTOR' : _OUTPUTDIRECTORY,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.OutputDirectory)
-  ))
+  })
 _sym_db.RegisterMessage(OutputDirectory)
 
-ExecutionPolicy = _reflection.GeneratedProtocolMessageType('ExecutionPolicy', (_message.Message,), dict(
-  DESCRIPTOR = _EXECUTIONPOLICY,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ExecutionPolicy = _reflection.GeneratedProtocolMessageType('ExecutionPolicy', (_message.Message,), {
+  'DESCRIPTOR' : _EXECUTIONPOLICY,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecutionPolicy)
-  ))
+  })
 _sym_db.RegisterMessage(ExecutionPolicy)
 
-ResultsCachePolicy = _reflection.GeneratedProtocolMessageType('ResultsCachePolicy', (_message.Message,), dict(
-  DESCRIPTOR = _RESULTSCACHEPOLICY,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ResultsCachePolicy = _reflection.GeneratedProtocolMessageType('ResultsCachePolicy', (_message.Message,), {
+  'DESCRIPTOR' : _RESULTSCACHEPOLICY,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ResultsCachePolicy)
-  ))
+  })
 _sym_db.RegisterMessage(ResultsCachePolicy)
 
-ExecuteRequest = _reflection.GeneratedProtocolMessageType('ExecuteRequest', (_message.Message,), dict(
-  DESCRIPTOR = _EXECUTEREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ExecuteRequest = _reflection.GeneratedProtocolMessageType('ExecuteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _EXECUTEREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecuteRequest)
-  ))
+  })
 _sym_db.RegisterMessage(ExecuteRequest)
 
-LogFile = _reflection.GeneratedProtocolMessageType('LogFile', (_message.Message,), dict(
-  DESCRIPTOR = _LOGFILE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+LogFile = _reflection.GeneratedProtocolMessageType('LogFile', (_message.Message,), {
+  'DESCRIPTOR' : _LOGFILE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.LogFile)
-  ))
+  })
 _sym_db.RegisterMessage(LogFile)
 
-ExecuteResponse = _reflection.GeneratedProtocolMessageType('ExecuteResponse', (_message.Message,), dict(
+ExecuteResponse = _reflection.GeneratedProtocolMessageType('ExecuteResponse', (_message.Message,), {
 
-  ServerLogsEntry = _reflection.GeneratedProtocolMessageType('ServerLogsEntry', (_message.Message,), dict(
-    DESCRIPTOR = _EXECUTERESPONSE_SERVERLOGSENTRY,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'ServerLogsEntry' : _reflection.GeneratedProtocolMessageType('ServerLogsEntry', (_message.Message,), {
+    'DESCRIPTOR' : _EXECUTERESPONSE_SERVERLOGSENTRY,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry)
-    ))
+    })
   ,
-  DESCRIPTOR = _EXECUTERESPONSE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _EXECUTERESPONSE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecuteResponse)
-  ))
+  })
 _sym_db.RegisterMessage(ExecuteResponse)
 _sym_db.RegisterMessage(ExecuteResponse.ServerLogsEntry)
 
-ExecuteOperationMetadata = _reflection.GeneratedProtocolMessageType('ExecuteOperationMetadata', (_message.Message,), dict(
-  DESCRIPTOR = _EXECUTEOPERATIONMETADATA,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ExecuteOperationMetadata = _reflection.GeneratedProtocolMessageType('ExecuteOperationMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _EXECUTEOPERATIONMETADATA,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecuteOperationMetadata)
-  ))
+  })
 _sym_db.RegisterMessage(ExecuteOperationMetadata)
 
-WaitExecutionRequest = _reflection.GeneratedProtocolMessageType('WaitExecutionRequest', (_message.Message,), dict(
-  DESCRIPTOR = _WAITEXECUTIONREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+WaitExecutionRequest = _reflection.GeneratedProtocolMessageType('WaitExecutionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _WAITEXECUTIONREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.WaitExecutionRequest)
-  ))
+  })
 _sym_db.RegisterMessage(WaitExecutionRequest)
 
-GetActionResultRequest = _reflection.GeneratedProtocolMessageType('GetActionResultRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETACTIONRESULTREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+GetActionResultRequest = _reflection.GeneratedProtocolMessageType('GetActionResultRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETACTIONRESULTREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.GetActionResultRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetActionResultRequest)
 
-UpdateActionResultRequest = _reflection.GeneratedProtocolMessageType('UpdateActionResultRequest', (_message.Message,), dict(
-  DESCRIPTOR = _UPDATEACTIONRESULTREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+UpdateActionResultRequest = _reflection.GeneratedProtocolMessageType('UpdateActionResultRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEACTIONRESULTREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.UpdateActionResultRequest)
-  ))
+  })
 _sym_db.RegisterMessage(UpdateActionResultRequest)
 
-FindMissingBlobsRequest = _reflection.GeneratedProtocolMessageType('FindMissingBlobsRequest', (_message.Message,), dict(
-  DESCRIPTOR = _FINDMISSINGBLOBSREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+FindMissingBlobsRequest = _reflection.GeneratedProtocolMessageType('FindMissingBlobsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDMISSINGBLOBSREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.FindMissingBlobsRequest)
-  ))
+  })
 _sym_db.RegisterMessage(FindMissingBlobsRequest)
 
-FindMissingBlobsResponse = _reflection.GeneratedProtocolMessageType('FindMissingBlobsResponse', (_message.Message,), dict(
-  DESCRIPTOR = _FINDMISSINGBLOBSRESPONSE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+FindMissingBlobsResponse = _reflection.GeneratedProtocolMessageType('FindMissingBlobsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDMISSINGBLOBSRESPONSE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.FindMissingBlobsResponse)
-  ))
+  })
 _sym_db.RegisterMessage(FindMissingBlobsResponse)
 
-BatchUpdateBlobsRequest = _reflection.GeneratedProtocolMessageType('BatchUpdateBlobsRequest', (_message.Message,), dict(
+BatchUpdateBlobsRequest = _reflection.GeneratedProtocolMessageType('BatchUpdateBlobsRequest', (_message.Message,), {
 
-  Request = _reflection.GeneratedProtocolMessageType('Request', (_message.Message,), dict(
-    DESCRIPTOR = _BATCHUPDATEBLOBSREQUEST_REQUEST,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'Request' : _reflection.GeneratedProtocolMessageType('Request', (_message.Message,), {
+    'DESCRIPTOR' : _BATCHUPDATEBLOBSREQUEST_REQUEST,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request)
-    ))
+    })
   ,
-  DESCRIPTOR = _BATCHUPDATEBLOBSREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _BATCHUPDATEBLOBSREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchUpdateBlobsRequest)
-  ))
+  })
 _sym_db.RegisterMessage(BatchUpdateBlobsRequest)
 _sym_db.RegisterMessage(BatchUpdateBlobsRequest.Request)
 
-BatchUpdateBlobsResponse = _reflection.GeneratedProtocolMessageType('BatchUpdateBlobsResponse', (_message.Message,), dict(
+BatchUpdateBlobsResponse = _reflection.GeneratedProtocolMessageType('BatchUpdateBlobsResponse', (_message.Message,), {
 
-  Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), dict(
-    DESCRIPTOR = _BATCHUPDATEBLOBSRESPONSE_RESPONSE,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'Response' : _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), {
+    'DESCRIPTOR' : _BATCHUPDATEBLOBSRESPONSE_RESPONSE,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response)
-    ))
+    })
   ,
-  DESCRIPTOR = _BATCHUPDATEBLOBSRESPONSE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _BATCHUPDATEBLOBSRESPONSE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchUpdateBlobsResponse)
-  ))
+  })
 _sym_db.RegisterMessage(BatchUpdateBlobsResponse)
 _sym_db.RegisterMessage(BatchUpdateBlobsResponse.Response)
 
-BatchReadBlobsRequest = _reflection.GeneratedProtocolMessageType('BatchReadBlobsRequest', (_message.Message,), dict(
-  DESCRIPTOR = _BATCHREADBLOBSREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+BatchReadBlobsRequest = _reflection.GeneratedProtocolMessageType('BatchReadBlobsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _BATCHREADBLOBSREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchReadBlobsRequest)
-  ))
+  })
 _sym_db.RegisterMessage(BatchReadBlobsRequest)
 
-BatchReadBlobsResponse = _reflection.GeneratedProtocolMessageType('BatchReadBlobsResponse', (_message.Message,), dict(
+BatchReadBlobsResponse = _reflection.GeneratedProtocolMessageType('BatchReadBlobsResponse', (_message.Message,), {
 
-  Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), dict(
-    DESCRIPTOR = _BATCHREADBLOBSRESPONSE_RESPONSE,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'Response' : _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), {
+    'DESCRIPTOR' : _BATCHREADBLOBSRESPONSE_RESPONSE,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response)
-    ))
+    })
   ,
-  DESCRIPTOR = _BATCHREADBLOBSRESPONSE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _BATCHREADBLOBSRESPONSE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.BatchReadBlobsResponse)
-  ))
+  })
 _sym_db.RegisterMessage(BatchReadBlobsResponse)
 _sym_db.RegisterMessage(BatchReadBlobsResponse.Response)
 
-GetTreeRequest = _reflection.GeneratedProtocolMessageType('GetTreeRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETTREEREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+GetTreeRequest = _reflection.GeneratedProtocolMessageType('GetTreeRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETTREEREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.GetTreeRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetTreeRequest)
 
-GetTreeResponse = _reflection.GeneratedProtocolMessageType('GetTreeResponse', (_message.Message,), dict(
-  DESCRIPTOR = _GETTREERESPONSE,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+GetTreeResponse = _reflection.GeneratedProtocolMessageType('GetTreeResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETTREERESPONSE,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.GetTreeResponse)
-  ))
+  })
 _sym_db.RegisterMessage(GetTreeResponse)
 
-GetCapabilitiesRequest = _reflection.GeneratedProtocolMessageType('GetCapabilitiesRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETCAPABILITIESREQUEST,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+GetCapabilitiesRequest = _reflection.GeneratedProtocolMessageType('GetCapabilitiesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETCAPABILITIESREQUEST,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.GetCapabilitiesRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetCapabilitiesRequest)
 
-ServerCapabilities = _reflection.GeneratedProtocolMessageType('ServerCapabilities', (_message.Message,), dict(
-  DESCRIPTOR = _SERVERCAPABILITIES,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ServerCapabilities = _reflection.GeneratedProtocolMessageType('ServerCapabilities', (_message.Message,), {
+  'DESCRIPTOR' : _SERVERCAPABILITIES,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ServerCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(ServerCapabilities)
 
-ActionCacheUpdateCapabilities = _reflection.GeneratedProtocolMessageType('ActionCacheUpdateCapabilities', (_message.Message,), dict(
-  DESCRIPTOR = _ACTIONCACHEUPDATECAPABILITIES,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ActionCacheUpdateCapabilities = _reflection.GeneratedProtocolMessageType('ActionCacheUpdateCapabilities', (_message.Message,), {
+  'DESCRIPTOR' : _ACTIONCACHEUPDATECAPABILITIES,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(ActionCacheUpdateCapabilities)
 
-PriorityCapabilities = _reflection.GeneratedProtocolMessageType('PriorityCapabilities', (_message.Message,), dict(
+PriorityCapabilities = _reflection.GeneratedProtocolMessageType('PriorityCapabilities', (_message.Message,), {
 
-  PriorityRange = _reflection.GeneratedProtocolMessageType('PriorityRange', (_message.Message,), dict(
-    DESCRIPTOR = _PRIORITYCAPABILITIES_PRIORITYRANGE,
-    __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'PriorityRange' : _reflection.GeneratedProtocolMessageType('PriorityRange', (_message.Message,), {
+    'DESCRIPTOR' : _PRIORITYCAPABILITIES_PRIORITYRANGE,
+    '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
     # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange)
-    ))
+    })
   ,
-  DESCRIPTOR = _PRIORITYCAPABILITIES,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+  'DESCRIPTOR' : _PRIORITYCAPABILITIES,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.PriorityCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(PriorityCapabilities)
 _sym_db.RegisterMessage(PriorityCapabilities.PriorityRange)
 
-CacheCapabilities = _reflection.GeneratedProtocolMessageType('CacheCapabilities', (_message.Message,), dict(
-  DESCRIPTOR = _CACHECAPABILITIES,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+CacheCapabilities = _reflection.GeneratedProtocolMessageType('CacheCapabilities', (_message.Message,), {
+  'DESCRIPTOR' : _CACHECAPABILITIES,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.CacheCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(CacheCapabilities)
 
-ExecutionCapabilities = _reflection.GeneratedProtocolMessageType('ExecutionCapabilities', (_message.Message,), dict(
-  DESCRIPTOR = _EXECUTIONCAPABILITIES,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ExecutionCapabilities = _reflection.GeneratedProtocolMessageType('ExecutionCapabilities', (_message.Message,), {
+  'DESCRIPTOR' : _EXECUTIONCAPABILITIES,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ExecutionCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(ExecutionCapabilities)
 
-ToolDetails = _reflection.GeneratedProtocolMessageType('ToolDetails', (_message.Message,), dict(
-  DESCRIPTOR = _TOOLDETAILS,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ToolDetails = _reflection.GeneratedProtocolMessageType('ToolDetails', (_message.Message,), {
+  'DESCRIPTOR' : _TOOLDETAILS,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.ToolDetails)
-  ))
+  })
 _sym_db.RegisterMessage(ToolDetails)
 
-RequestMetadata = _reflection.GeneratedProtocolMessageType('RequestMetadata', (_message.Message,), dict(
-  DESCRIPTOR = _REQUESTMETADATA,
-  __module__ = 'build.bazel.remote.execution.v2.remote_execution_pb2'
+RequestMetadata = _reflection.GeneratedProtocolMessageType('RequestMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _REQUESTMETADATA,
+  '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.RequestMetadata)
-  ))
+  })
 _sym_db.RegisterMessage(RequestMetadata)
 
 
diff --git a/src/buildstream/_protos/build/bazel/semver/semver_pb2.py b/src/buildstream/_protos/build/bazel/semver/semver_pb2.py
index ab87a04..5712099 100644
--- a/src/buildstream/_protos/build/bazel/semver/semver_pb2.py
+++ b/src/buildstream/_protos/build/bazel/semver/semver_pb2.py
@@ -80,11 +80,11 @@
 DESCRIPTOR.message_types_by_name['SemVer'] = _SEMVER
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-SemVer = _reflection.GeneratedProtocolMessageType('SemVer', (_message.Message,), dict(
-  DESCRIPTOR = _SEMVER,
-  __module__ = 'build.bazel.semver.semver_pb2'
+SemVer = _reflection.GeneratedProtocolMessageType('SemVer', (_message.Message,), {
+  'DESCRIPTOR' : _SEMVER,
+  '__module__' : 'build.bazel.semver.semver_pb2'
   # @@protoc_insertion_point(class_scope:build.bazel.semver.SemVer)
-  ))
+  })
 _sym_db.RegisterMessage(SemVer)
 
 
diff --git a/src/buildstream/_protos/buildstream/v2/artifact.proto b/src/buildstream/_protos/buildstream/v2/artifact.proto
index d28c8e8..ead792e 100644
--- a/src/buildstream/_protos/buildstream/v2/artifact.proto
+++ b/src/buildstream/_protos/buildstream/v2/artifact.proto
@@ -54,9 +54,10 @@
 
   // Information about the build dependencies
   message Dependency {
-    string element_name = 1;
-    string cache_key = 2;
-    bool was_workspaced = 3;
+    string project_name = 1;
+    string element_name = 2;
+    string cache_key = 3;
+    bool was_workspaced = 4;
   };
   repeated Dependency build_deps = 9;
 
diff --git a/src/buildstream/_protos/buildstream/v2/artifact_pb2.py b/src/buildstream/_protos/buildstream/v2/artifact_pb2.py
index da642ca..6ea9c4e 100644
--- a/src/buildstream/_protos/buildstream/v2/artifact_pb2.py
+++ b/src/buildstream/_protos/buildstream/v2/artifact_pb2.py
@@ -22,7 +22,7 @@
   package='buildstream.v2',
   syntax='proto3',
   serialized_options=None,
-  serialized_pb=_b('\n\x1d\x62uildstream/v2/artifact.proto\x12\x0e\x62uildstream.v2\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x1cgoogle/api/annotations.proto\"\xde\x04\n\x08\x41rtifact\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x15\n\rbuild_success\x18\x02 \x01(\x08\x12\x13\n\x0b\x62uild_error\x18\x03 \x01(\t\x12\x1b\n\x13\x62uild_error_details\x18\x04 \x01(\t\x12\x12\n\nstrong_key\x18\x05 \x01(\t\x12\x10\n\x08weak_key\x18\x06 \x01(\t\x12\x16\n\x0ewas_workspaced\x18\x07 \x01(\x08\x12\x36\n\x05\x66iles\x18\x08 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x37\n\nbuild_deps\x18\t \x03(\x0b\x32#.buildstream.v2.Artifact.Dependency\x12<\n\x0bpublic_data\x18\n \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12.\n\x04logs\x18\x0b \x03(\x0b\x32 .buildstream.v2.Artifact.LogFile\x12:\n\tbuildtree\x18\x0c \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x1aM\n\nDependency\x12\x14\n\x0c\x65lement_name\x18\x01 \x01(\t\x12\x11\n\tcache_key\x18\x02 \x01(\t\x12\x16\n\x0ewas_workspaced\x18\x03 \x01(\x08\x1aP\n\x07LogFile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\">\n\x12GetArtifactRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x11\n\tcache_key\x18\x02 \x01(\t\"m\n\x15UpdateArtifactRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x11\n\tcache_key\x18\x02 \x01(\t\x12*\n\x08\x61rtifact\x18\x03 \x01(\x0b\x32\x18.buildstream.v2.Artifact2\xb5\x01\n\x0f\x41rtifactService\x12M\n\x0bGetArtifact\x12\".buildstream.v2.GetArtifactRequest\x1a\x18.buildstream.v2.Artifact\"\x00\x12S\n\x0eUpdateArtifact\x12%.buildstream.v2.UpdateArtifactRequest\x1a\x18.buildstream.v2.Artifact\"\x00\x62\x06proto3')
+  serialized_pb=_b('\n\x1d\x62uildstream/v2/artifact.proto\x12\x0e\x62uildstream.v2\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x1cgoogle/api/annotations.proto\"\xf4\x04\n\x08\x41rtifact\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x15\n\rbuild_success\x18\x02 \x01(\x08\x12\x13\n\x0b\x62uild_error\x18\x03 \x01(\t\x12\x1b\n\x13\x62uild_error_details\x18\x04 \x01(\t\x12\x12\n\nstrong_key\x18\x05 \x01(\t\x12\x10\n\x08weak_key\x18\x06 \x01(\t\x12\x16\n\x0ewas_workspaced\x18\x07 \x01(\x08\x12\x36\n\x05\x66iles\x18\x08 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x37\n\nbuild_deps\x18\t \x03(\x0b\x32#.buildstream.v2.Artifact.Dependency\x12<\n\x0bpublic_data\x18\n \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12.\n\x04logs\x18\x0b \x03(\x0b\x32 .buildstream.v2.Artifact.LogFile\x12:\n\tbuildtree\x18\x0c \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x1a\x63\n\nDependency\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x14\n\x0c\x65lement_name\x18\x02 \x01(\t\x12\x11\n\tcache_key\x18\x03 \x01(\t\x12\x16\n\x0ewas_workspaced\x18\x04 \x01(\x08\x1aP\n\x07LogFile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\">\n\x12GetArtifactRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x11\n\tcache_key\x18\x02 \x01(\t\"m\n\x15UpdateArtifactRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x11\n\tcache_key\x18\x02 \x01(\t\x12*\n\x08\x61rtifact\x18\x03 \x01(\x0b\x32\x18.buildstream.v2.Artifact2\xb5\x01\n\x0f\x41rtifactService\x12M\n\x0bGetArtifact\x12\".buildstream.v2.GetArtifactRequest\x1a\x18.buildstream.v2.Artifact\"\x00\x12S\n\x0eUpdateArtifact\x12%.buildstream.v2.UpdateArtifactRequest\x1a\x18.buildstream.v2.Artifact\"\x00\x62\x06proto3')
   ,
   dependencies=[build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.DESCRIPTOR,google_dot_api_dot_annotations__pb2.DESCRIPTOR,])
 
@@ -37,22 +37,29 @@
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='element_name', full_name='buildstream.v2.Artifact.Dependency.element_name', index=0,
+      name='project_name', full_name='buildstream.v2.Artifact.Dependency.project_name', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='cache_key', full_name='buildstream.v2.Artifact.Dependency.cache_key', index=1,
+      name='element_name', full_name='buildstream.v2.Artifact.Dependency.element_name', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='was_workspaced', full_name='buildstream.v2.Artifact.Dependency.was_workspaced', index=2,
-      number=3, type=8, cpp_type=7, label=1,
+      name='cache_key', full_name='buildstream.v2.Artifact.Dependency.cache_key', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='was_workspaced', full_name='buildstream.v2.Artifact.Dependency.was_workspaced', index=3,
+      number=4, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
@@ -70,7 +77,7 @@
   oneofs=[
   ],
   serialized_start=583,
-  serialized_end=660,
+  serialized_end=682,
 )
 
 _ARTIFACT_LOGFILE = _descriptor.Descriptor(
@@ -106,8 +113,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=662,
-  serialized_end=742,
+  serialized_start=684,
+  serialized_end=764,
 )
 
 _ARTIFACT = _descriptor.Descriptor(
@@ -214,7 +221,7 @@
   oneofs=[
   ],
   serialized_start=136,
-  serialized_end=742,
+  serialized_end=764,
 )
 
 
@@ -251,8 +258,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=744,
-  serialized_end=806,
+  serialized_start=766,
+  serialized_end=828,
 )
 
 
@@ -296,8 +303,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=808,
-  serialized_end=917,
+  serialized_start=830,
+  serialized_end=939,
 )
 
 _ARTIFACT_DEPENDENCY.containing_type = _ARTIFACT
@@ -314,41 +321,41 @@
 DESCRIPTOR.message_types_by_name['UpdateArtifactRequest'] = _UPDATEARTIFACTREQUEST
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-Artifact = _reflection.GeneratedProtocolMessageType('Artifact', (_message.Message,), dict(
+Artifact = _reflection.GeneratedProtocolMessageType('Artifact', (_message.Message,), {
 
-  Dependency = _reflection.GeneratedProtocolMessageType('Dependency', (_message.Message,), dict(
-    DESCRIPTOR = _ARTIFACT_DEPENDENCY,
-    __module__ = 'buildstream.v2.artifact_pb2'
+  'Dependency' : _reflection.GeneratedProtocolMessageType('Dependency', (_message.Message,), {
+    'DESCRIPTOR' : _ARTIFACT_DEPENDENCY,
+    '__module__' : 'buildstream.v2.artifact_pb2'
     # @@protoc_insertion_point(class_scope:buildstream.v2.Artifact.Dependency)
-    ))
+    })
   ,
 
-  LogFile = _reflection.GeneratedProtocolMessageType('LogFile', (_message.Message,), dict(
-    DESCRIPTOR = _ARTIFACT_LOGFILE,
-    __module__ = 'buildstream.v2.artifact_pb2'
+  'LogFile' : _reflection.GeneratedProtocolMessageType('LogFile', (_message.Message,), {
+    'DESCRIPTOR' : _ARTIFACT_LOGFILE,
+    '__module__' : 'buildstream.v2.artifact_pb2'
     # @@protoc_insertion_point(class_scope:buildstream.v2.Artifact.LogFile)
-    ))
+    })
   ,
-  DESCRIPTOR = _ARTIFACT,
-  __module__ = 'buildstream.v2.artifact_pb2'
+  'DESCRIPTOR' : _ARTIFACT,
+  '__module__' : 'buildstream.v2.artifact_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.Artifact)
-  ))
+  })
 _sym_db.RegisterMessage(Artifact)
 _sym_db.RegisterMessage(Artifact.Dependency)
 _sym_db.RegisterMessage(Artifact.LogFile)
 
-GetArtifactRequest = _reflection.GeneratedProtocolMessageType('GetArtifactRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETARTIFACTREQUEST,
-  __module__ = 'buildstream.v2.artifact_pb2'
+GetArtifactRequest = _reflection.GeneratedProtocolMessageType('GetArtifactRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETARTIFACTREQUEST,
+  '__module__' : 'buildstream.v2.artifact_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.GetArtifactRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetArtifactRequest)
 
-UpdateArtifactRequest = _reflection.GeneratedProtocolMessageType('UpdateArtifactRequest', (_message.Message,), dict(
-  DESCRIPTOR = _UPDATEARTIFACTREQUEST,
-  __module__ = 'buildstream.v2.artifact_pb2'
+UpdateArtifactRequest = _reflection.GeneratedProtocolMessageType('UpdateArtifactRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEARTIFACTREQUEST,
+  '__module__' : 'buildstream.v2.artifact_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.UpdateArtifactRequest)
-  ))
+  })
 _sym_db.RegisterMessage(UpdateArtifactRequest)
 
 
@@ -359,8 +366,8 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=920,
-  serialized_end=1101,
+  serialized_start=942,
+  serialized_end=1123,
   methods=[
   _descriptor.MethodDescriptor(
     name='GetArtifact',
diff --git a/src/buildstream/_protos/buildstream/v2/buildstream_pb2.py b/src/buildstream/_protos/buildstream/v2/buildstream_pb2.py
index 877cd30..0b6243a 100644
--- a/src/buildstream/_protos/buildstream/v2/buildstream_pb2.py
+++ b/src/buildstream/_protos/buildstream/v2/buildstream_pb2.py
@@ -375,74 +375,74 @@
 DESCRIPTOR.message_types_by_name['ServerCapabilities'] = _SERVERCAPABILITIES
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-GetReferenceRequest = _reflection.GeneratedProtocolMessageType('GetReferenceRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETREFERENCEREQUEST,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+GetReferenceRequest = _reflection.GeneratedProtocolMessageType('GetReferenceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREFERENCEREQUEST,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.GetReferenceRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetReferenceRequest)
 
-GetReferenceResponse = _reflection.GeneratedProtocolMessageType('GetReferenceResponse', (_message.Message,), dict(
-  DESCRIPTOR = _GETREFERENCERESPONSE,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+GetReferenceResponse = _reflection.GeneratedProtocolMessageType('GetReferenceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETREFERENCERESPONSE,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.GetReferenceResponse)
-  ))
+  })
 _sym_db.RegisterMessage(GetReferenceResponse)
 
-UpdateReferenceRequest = _reflection.GeneratedProtocolMessageType('UpdateReferenceRequest', (_message.Message,), dict(
-  DESCRIPTOR = _UPDATEREFERENCEREQUEST,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+UpdateReferenceRequest = _reflection.GeneratedProtocolMessageType('UpdateReferenceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREFERENCEREQUEST,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.UpdateReferenceRequest)
-  ))
+  })
 _sym_db.RegisterMessage(UpdateReferenceRequest)
 
-UpdateReferenceResponse = _reflection.GeneratedProtocolMessageType('UpdateReferenceResponse', (_message.Message,), dict(
-  DESCRIPTOR = _UPDATEREFERENCERESPONSE,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+UpdateReferenceResponse = _reflection.GeneratedProtocolMessageType('UpdateReferenceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREFERENCERESPONSE,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.UpdateReferenceResponse)
-  ))
+  })
 _sym_db.RegisterMessage(UpdateReferenceResponse)
 
-StatusRequest = _reflection.GeneratedProtocolMessageType('StatusRequest', (_message.Message,), dict(
-  DESCRIPTOR = _STATUSREQUEST,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+StatusRequest = _reflection.GeneratedProtocolMessageType('StatusRequest', (_message.Message,), {
+  'DESCRIPTOR' : _STATUSREQUEST,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.StatusRequest)
-  ))
+  })
 _sym_db.RegisterMessage(StatusRequest)
 
-StatusResponse = _reflection.GeneratedProtocolMessageType('StatusResponse', (_message.Message,), dict(
-  DESCRIPTOR = _STATUSRESPONSE,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+StatusResponse = _reflection.GeneratedProtocolMessageType('StatusResponse', (_message.Message,), {
+  'DESCRIPTOR' : _STATUSRESPONSE,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.StatusResponse)
-  ))
+  })
 _sym_db.RegisterMessage(StatusResponse)
 
-GetCapabilitiesRequest = _reflection.GeneratedProtocolMessageType('GetCapabilitiesRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETCAPABILITIESREQUEST,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+GetCapabilitiesRequest = _reflection.GeneratedProtocolMessageType('GetCapabilitiesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETCAPABILITIESREQUEST,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.GetCapabilitiesRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetCapabilitiesRequest)
 
-ArtifactCapabilities = _reflection.GeneratedProtocolMessageType('ArtifactCapabilities', (_message.Message,), dict(
-  DESCRIPTOR = _ARTIFACTCAPABILITIES,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+ArtifactCapabilities = _reflection.GeneratedProtocolMessageType('ArtifactCapabilities', (_message.Message,), {
+  'DESCRIPTOR' : _ARTIFACTCAPABILITIES,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.ArtifactCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(ArtifactCapabilities)
 
-SourceCapabilities = _reflection.GeneratedProtocolMessageType('SourceCapabilities', (_message.Message,), dict(
-  DESCRIPTOR = _SOURCECAPABILITIES,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+SourceCapabilities = _reflection.GeneratedProtocolMessageType('SourceCapabilities', (_message.Message,), {
+  'DESCRIPTOR' : _SOURCECAPABILITIES,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.SourceCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(SourceCapabilities)
 
-ServerCapabilities = _reflection.GeneratedProtocolMessageType('ServerCapabilities', (_message.Message,), dict(
-  DESCRIPTOR = _SERVERCAPABILITIES,
-  __module__ = 'buildstream.v2.buildstream_pb2'
+ServerCapabilities = _reflection.GeneratedProtocolMessageType('ServerCapabilities', (_message.Message,), {
+  'DESCRIPTOR' : _SERVERCAPABILITIES,
+  '__module__' : 'buildstream.v2.buildstream_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.ServerCapabilities)
-  ))
+  })
 _sym_db.RegisterMessage(ServerCapabilities)
 
 
diff --git a/src/buildstream/_protos/buildstream/v2/source_pb2.py b/src/buildstream/_protos/buildstream/v2/source_pb2.py
index c91dee0..80ecb20 100644
--- a/src/buildstream/_protos/buildstream/v2/source_pb2.py
+++ b/src/buildstream/_protos/buildstream/v2/source_pb2.py
@@ -156,25 +156,25 @@
 DESCRIPTOR.message_types_by_name['UpdateSourceRequest'] = _UPDATESOURCEREQUEST
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-Source = _reflection.GeneratedProtocolMessageType('Source', (_message.Message,), dict(
-  DESCRIPTOR = _SOURCE,
-  __module__ = 'buildstream.v2.source_pb2'
+Source = _reflection.GeneratedProtocolMessageType('Source', (_message.Message,), {
+  'DESCRIPTOR' : _SOURCE,
+  '__module__' : 'buildstream.v2.source_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.Source)
-  ))
+  })
 _sym_db.RegisterMessage(Source)
 
-GetSourceRequest = _reflection.GeneratedProtocolMessageType('GetSourceRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETSOURCEREQUEST,
-  __module__ = 'buildstream.v2.source_pb2'
+GetSourceRequest = _reflection.GeneratedProtocolMessageType('GetSourceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETSOURCEREQUEST,
+  '__module__' : 'buildstream.v2.source_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.GetSourceRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetSourceRequest)
 
-UpdateSourceRequest = _reflection.GeneratedProtocolMessageType('UpdateSourceRequest', (_message.Message,), dict(
-  DESCRIPTOR = _UPDATESOURCEREQUEST,
-  __module__ = 'buildstream.v2.source_pb2'
+UpdateSourceRequest = _reflection.GeneratedProtocolMessageType('UpdateSourceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATESOURCEREQUEST,
+  '__module__' : 'buildstream.v2.source_pb2'
   # @@protoc_insertion_point(class_scope:buildstream.v2.UpdateSourceRequest)
-  ))
+  })
 _sym_db.RegisterMessage(UpdateSourceRequest)
 
 
diff --git a/src/buildstream/_protos/google/api/http_pb2.py b/src/buildstream/_protos/google/api/http_pb2.py
index fa896d4..601b12a 100644
--- a/src/buildstream/_protos/google/api/http_pb2.py
+++ b/src/buildstream/_protos/google/api/http_pb2.py
@@ -217,25 +217,25 @@
 DESCRIPTOR.message_types_by_name['CustomHttpPattern'] = _CUSTOMHTTPPATTERN
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-Http = _reflection.GeneratedProtocolMessageType('Http', (_message.Message,), dict(
-  DESCRIPTOR = _HTTP,
-  __module__ = 'google.api.http_pb2'
+Http = _reflection.GeneratedProtocolMessageType('Http', (_message.Message,), {
+  'DESCRIPTOR' : _HTTP,
+  '__module__' : 'google.api.http_pb2'
   # @@protoc_insertion_point(class_scope:google.api.Http)
-  ))
+  })
 _sym_db.RegisterMessage(Http)
 
-HttpRule = _reflection.GeneratedProtocolMessageType('HttpRule', (_message.Message,), dict(
-  DESCRIPTOR = _HTTPRULE,
-  __module__ = 'google.api.http_pb2'
+HttpRule = _reflection.GeneratedProtocolMessageType('HttpRule', (_message.Message,), {
+  'DESCRIPTOR' : _HTTPRULE,
+  '__module__' : 'google.api.http_pb2'
   # @@protoc_insertion_point(class_scope:google.api.HttpRule)
-  ))
+  })
 _sym_db.RegisterMessage(HttpRule)
 
-CustomHttpPattern = _reflection.GeneratedProtocolMessageType('CustomHttpPattern', (_message.Message,), dict(
-  DESCRIPTOR = _CUSTOMHTTPPATTERN,
-  __module__ = 'google.api.http_pb2'
+CustomHttpPattern = _reflection.GeneratedProtocolMessageType('CustomHttpPattern', (_message.Message,), {
+  'DESCRIPTOR' : _CUSTOMHTTPPATTERN,
+  '__module__' : 'google.api.http_pb2'
   # @@protoc_insertion_point(class_scope:google.api.CustomHttpPattern)
-  ))
+  })
 _sym_db.RegisterMessage(CustomHttpPattern)
 
 
diff --git a/src/buildstream/_protos/google/bytestream/bytestream_pb2.py b/src/buildstream/_protos/google/bytestream/bytestream_pb2.py
index 474ab3f..c8787c7 100644
--- a/src/buildstream/_protos/google/bytestream/bytestream_pb2.py
+++ b/src/buildstream/_protos/google/bytestream/bytestream_pb2.py
@@ -264,46 +264,46 @@
 DESCRIPTOR.message_types_by_name['QueryWriteStatusResponse'] = _QUERYWRITESTATUSRESPONSE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-ReadRequest = _reflection.GeneratedProtocolMessageType('ReadRequest', (_message.Message,), dict(
-  DESCRIPTOR = _READREQUEST,
-  __module__ = 'google.bytestream.bytestream_pb2'
+ReadRequest = _reflection.GeneratedProtocolMessageType('ReadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _READREQUEST,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.ReadRequest)
-  ))
+  })
 _sym_db.RegisterMessage(ReadRequest)
 
-ReadResponse = _reflection.GeneratedProtocolMessageType('ReadResponse', (_message.Message,), dict(
-  DESCRIPTOR = _READRESPONSE,
-  __module__ = 'google.bytestream.bytestream_pb2'
+ReadResponse = _reflection.GeneratedProtocolMessageType('ReadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _READRESPONSE,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.ReadResponse)
-  ))
+  })
 _sym_db.RegisterMessage(ReadResponse)
 
-WriteRequest = _reflection.GeneratedProtocolMessageType('WriteRequest', (_message.Message,), dict(
-  DESCRIPTOR = _WRITEREQUEST,
-  __module__ = 'google.bytestream.bytestream_pb2'
+WriteRequest = _reflection.GeneratedProtocolMessageType('WriteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _WRITEREQUEST,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.WriteRequest)
-  ))
+  })
 _sym_db.RegisterMessage(WriteRequest)
 
-WriteResponse = _reflection.GeneratedProtocolMessageType('WriteResponse', (_message.Message,), dict(
-  DESCRIPTOR = _WRITERESPONSE,
-  __module__ = 'google.bytestream.bytestream_pb2'
+WriteResponse = _reflection.GeneratedProtocolMessageType('WriteResponse', (_message.Message,), {
+  'DESCRIPTOR' : _WRITERESPONSE,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.WriteResponse)
-  ))
+  })
 _sym_db.RegisterMessage(WriteResponse)
 
-QueryWriteStatusRequest = _reflection.GeneratedProtocolMessageType('QueryWriteStatusRequest', (_message.Message,), dict(
-  DESCRIPTOR = _QUERYWRITESTATUSREQUEST,
-  __module__ = 'google.bytestream.bytestream_pb2'
+QueryWriteStatusRequest = _reflection.GeneratedProtocolMessageType('QueryWriteStatusRequest', (_message.Message,), {
+  'DESCRIPTOR' : _QUERYWRITESTATUSREQUEST,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.QueryWriteStatusRequest)
-  ))
+  })
 _sym_db.RegisterMessage(QueryWriteStatusRequest)
 
-QueryWriteStatusResponse = _reflection.GeneratedProtocolMessageType('QueryWriteStatusResponse', (_message.Message,), dict(
-  DESCRIPTOR = _QUERYWRITESTATUSRESPONSE,
-  __module__ = 'google.bytestream.bytestream_pb2'
+QueryWriteStatusResponse = _reflection.GeneratedProtocolMessageType('QueryWriteStatusResponse', (_message.Message,), {
+  'DESCRIPTOR' : _QUERYWRITESTATUSRESPONSE,
+  '__module__' : 'google.bytestream.bytestream_pb2'
   # @@protoc_insertion_point(class_scope:google.bytestream.QueryWriteStatusResponse)
-  ))
+  })
 _sym_db.RegisterMessage(QueryWriteStatusResponse)
 
 
diff --git a/src/buildstream/_protos/google/longrunning/operations_pb2.py b/src/buildstream/_protos/google/longrunning/operations_pb2.py
index de961b0..01bd129 100644
--- a/src/buildstream/_protos/google/longrunning/operations_pb2.py
+++ b/src/buildstream/_protos/google/longrunning/operations_pb2.py
@@ -293,46 +293,46 @@
 DESCRIPTOR.message_types_by_name['DeleteOperationRequest'] = _DELETEOPERATIONREQUEST
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-Operation = _reflection.GeneratedProtocolMessageType('Operation', (_message.Message,), dict(
-  DESCRIPTOR = _OPERATION,
-  __module__ = 'google.longrunning.operations_pb2'
+Operation = _reflection.GeneratedProtocolMessageType('Operation', (_message.Message,), {
+  'DESCRIPTOR' : _OPERATION,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.Operation)
-  ))
+  })
 _sym_db.RegisterMessage(Operation)
 
-GetOperationRequest = _reflection.GeneratedProtocolMessageType('GetOperationRequest', (_message.Message,), dict(
-  DESCRIPTOR = _GETOPERATIONREQUEST,
-  __module__ = 'google.longrunning.operations_pb2'
+GetOperationRequest = _reflection.GeneratedProtocolMessageType('GetOperationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETOPERATIONREQUEST,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.GetOperationRequest)
-  ))
+  })
 _sym_db.RegisterMessage(GetOperationRequest)
 
-ListOperationsRequest = _reflection.GeneratedProtocolMessageType('ListOperationsRequest', (_message.Message,), dict(
-  DESCRIPTOR = _LISTOPERATIONSREQUEST,
-  __module__ = 'google.longrunning.operations_pb2'
+ListOperationsRequest = _reflection.GeneratedProtocolMessageType('ListOperationsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTOPERATIONSREQUEST,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.ListOperationsRequest)
-  ))
+  })
 _sym_db.RegisterMessage(ListOperationsRequest)
 
-ListOperationsResponse = _reflection.GeneratedProtocolMessageType('ListOperationsResponse', (_message.Message,), dict(
-  DESCRIPTOR = _LISTOPERATIONSRESPONSE,
-  __module__ = 'google.longrunning.operations_pb2'
+ListOperationsResponse = _reflection.GeneratedProtocolMessageType('ListOperationsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTOPERATIONSRESPONSE,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.ListOperationsResponse)
-  ))
+  })
 _sym_db.RegisterMessage(ListOperationsResponse)
 
-CancelOperationRequest = _reflection.GeneratedProtocolMessageType('CancelOperationRequest', (_message.Message,), dict(
-  DESCRIPTOR = _CANCELOPERATIONREQUEST,
-  __module__ = 'google.longrunning.operations_pb2'
+CancelOperationRequest = _reflection.GeneratedProtocolMessageType('CancelOperationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CANCELOPERATIONREQUEST,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.CancelOperationRequest)
-  ))
+  })
 _sym_db.RegisterMessage(CancelOperationRequest)
 
-DeleteOperationRequest = _reflection.GeneratedProtocolMessageType('DeleteOperationRequest', (_message.Message,), dict(
-  DESCRIPTOR = _DELETEOPERATIONREQUEST,
-  __module__ = 'google.longrunning.operations_pb2'
+DeleteOperationRequest = _reflection.GeneratedProtocolMessageType('DeleteOperationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEOPERATIONREQUEST,
+  '__module__' : 'google.longrunning.operations_pb2'
   # @@protoc_insertion_point(class_scope:google.longrunning.DeleteOperationRequest)
-  ))
+  })
 _sym_db.RegisterMessage(DeleteOperationRequest)
 
 
diff --git a/src/buildstream/_protos/google/rpc/status_pb2.py b/src/buildstream/_protos/google/rpc/status_pb2.py
index a7d8f9a..7b353ae 100644
--- a/src/buildstream/_protos/google/rpc/status_pb2.py
+++ b/src/buildstream/_protos/google/rpc/status_pb2.py
@@ -76,11 +76,11 @@
 DESCRIPTOR.message_types_by_name['Status'] = _STATUS
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), dict(
-  DESCRIPTOR = _STATUS,
-  __module__ = 'google.rpc.status_pb2'
+Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
+  'DESCRIPTOR' : _STATUS,
+  '__module__' : 'google.rpc.status_pb2'
   # @@protoc_insertion_point(class_scope:google.rpc.Status)
-  ))
+  })
 _sym_db.RegisterMessage(Status)
 
 
diff --git a/src/buildstream/_versions.py b/src/buildstream/_versions.py
index cbaa52e..2270bc0 100644
--- a/src/buildstream/_versions.py
+++ b/src/buildstream/_versions.py
@@ -33,4 +33,4 @@
 # or if buildstream was changed in a way which can cause
 # the same cache key to produce something that is no longer
 # the same.
-BST_CORE_ARTIFACT_VERSION = 8
+BST_CORE_ARTIFACT_VERSION = 9
diff --git a/src/buildstream/element.py b/src/buildstream/element.py
index f28f482..ca573be 100644
--- a/src/buildstream/element.py
+++ b/src/buildstream/element.py
@@ -197,6 +197,7 @@
         if not meta.is_junction:
             project.ensure_fully_loaded()
 
+        self.project_name = self._get_project().name
         self.normal_name = _get_normal_name(self.name)
         """A normalized element name
 
@@ -586,13 +587,12 @@
         Returns:
            (str): The relative path for the artifact
         """
-        project = self._get_project()
         if key is None:
             key = self._get_cache_key()
 
         assert key is not None
 
-        return _compose_artifact_name(project.name, self.normal_name, key)
+        return _compose_artifact_name(self.project_name, self.normal_name, key)
 
     def stage_artifact(self, sandbox, *, path=None, include=None, exclude=None, orphans=True, update_mtimes=None):
         """Stage this element's output artifact in the sandbox
@@ -3099,7 +3099,7 @@
                 ]
             else:
                 dependencies = [
-                    e.name for e in self.dependencies(Scope.BUILD, recurse=False)
+                    [e.project_name, e.name] for e in self.dependencies(Scope.BUILD, recurse=False)
                 ]
 
             self.__weak_cache_key = self._calculate_cache_key(dependencies)
@@ -3111,7 +3111,8 @@
 
         if self.__strict_cache_key is None:
             dependencies = [
-                e.__strict_cache_key for e in self.dependencies(Scope.BUILD)
+                [e.project_name, e.name, e.__strict_cache_key] if e.__strict_cache_key is not None else None
+                for e in self.dependencies(Scope.BUILD)
             ]
             self.__strict_cache_key = self._calculate_cache_key(dependencies)
 
diff --git a/tests/cachekey/project/elements/build1.expected b/tests/cachekey/project/elements/build1.expected
index 94faf95..275abd2 100644
--- a/tests/cachekey/project/elements/build1.expected
+++ b/tests/cachekey/project/elements/build1.expected
@@ -1 +1 @@
-e6ab4d95bce16f19bd67db8abd6bffdbee25602a6b32c7ebfc9df965bfc3ebe7
\ No newline at end of file
+ba3cc6aeaef5d4c559acbd3a92e7a2512a72674c3e98aaf44256eb1c951a1a29
\ No newline at end of file
diff --git a/tests/cachekey/project/elements/build2.expected b/tests/cachekey/project/elements/build2.expected
index 3a8413b..ded4d5b 100644
--- a/tests/cachekey/project/elements/build2.expected
+++ b/tests/cachekey/project/elements/build2.expected
@@ -1 +1 @@
-e80d089fa4b0934fb8fd04259c51c8db045114770e4ba0ef531fae73e43c5a8a
\ No newline at end of file
+707ca16d9d0efd925cdf7e5f2586c7ca6446ad739a0ecce22d3cb967dc557edb
\ No newline at end of file
diff --git a/tests/cachekey/project/elements/compose1.expected b/tests/cachekey/project/elements/compose1.expected
index 8d00e5c..e62634f 100644
--- a/tests/cachekey/project/elements/compose1.expected
+++ b/tests/cachekey/project/elements/compose1.expected
@@ -1 +1 @@
-e91019742fc42fb6758d0204e62179522fe886712657ae0e56a544c073e76330
\ No newline at end of file
+67fe128c47c16737fbb0c675a866a07bea3921715953b2c191ac282b1100b747
\ No newline at end of file
diff --git a/tests/cachekey/project/elements/compose2.expected b/tests/cachekey/project/elements/compose2.expected
index a45e2d1..9c11693 100644
--- a/tests/cachekey/project/elements/compose2.expected
+++ b/tests/cachekey/project/elements/compose2.expected
@@ -1 +1 @@
-d33107bfa4197b45ba934926829ffcab207cb14885e57541b4d73a7811ef6d23
\ No newline at end of file
+436d4c69b1d120315c7b073f564ae07568fd7d3ead0be3df9e90a702793ad107
\ No newline at end of file
diff --git a/tests/cachekey/project/elements/compose3.expected b/tests/cachekey/project/elements/compose3.expected
index 6296f5a..74347be 100644
--- a/tests/cachekey/project/elements/compose3.expected
+++ b/tests/cachekey/project/elements/compose3.expected
@@ -1 +1 @@
-603c482bc6b35a30916c5f9404089decb31744518e07bd4488883f0ce3ffce94
\ No newline at end of file
+cfb87e685ad0569f92eb2ac7d0f121dd62e3eb4e0a82f559ccf402887461d7aa
\ No newline at end of file
diff --git a/tests/cachekey/project/elements/compose4.expected b/tests/cachekey/project/elements/compose4.expected
index ea50ddf..4a80931 100644
--- a/tests/cachekey/project/elements/compose4.expected
+++ b/tests/cachekey/project/elements/compose4.expected
@@ -1 +1 @@
-433c0e5b6c0eeeb042e3f6ac39819847c424d104b0cf2ccb7ee48a2eba5bec2e
\ No newline at end of file
+dc962993b42725a3fbfcb0e38557a663b610e5033e6e2a31dcb8a2e87a5b9117
\ No newline at end of file
diff --git a/tests/cachekey/project/elements/compose5.expected b/tests/cachekey/project/elements/compose5.expected
index 778ddf9..355a9fe 100644
--- a/tests/cachekey/project/elements/compose5.expected
+++ b/tests/cachekey/project/elements/compose5.expected
@@ -1 +1 @@
-35c484d8deb9cb0f8f8a8ec1c3306a0b43846df7d658aa4bfff5d4ff146b98e3
\ No newline at end of file
+ea2ca85b60271c877f45067de8c7786bbb5317447e127fbf011cc888e47c264e
\ No newline at end of file
diff --git a/tests/cachekey/project/elements/import1.expected b/tests/cachekey/project/elements/import1.expected
index 64e4e9e..5cb6a19 100644
--- a/tests/cachekey/project/elements/import1.expected
+++ b/tests/cachekey/project/elements/import1.expected
@@ -1 +1 @@
-a698b669286dccb0708decaec3ea21e77a1eb1c15fe6769f0546d6dc94098f0f
\ No newline at end of file
+402b946498422abb82133fa5998b97f93b08d66ee1f332154413886687d8e7e9
\ No newline at end of file
diff --git a/tests/cachekey/project/elements/import2.expected b/tests/cachekey/project/elements/import2.expected
index 1ea9885..5815a20 100644
--- a/tests/cachekey/project/elements/import2.expected
+++ b/tests/cachekey/project/elements/import2.expected
@@ -1 +1 @@
-9f6c90d1b4233edcf1feee49e5486ab1ede1ade54fea285dbc041fddb8c3ee85
\ No newline at end of file
+030b97f6f854c270126aa3cc7ac5d541e77e42f984b61aef63b2bce183982310
\ No newline at end of file
diff --git a/tests/cachekey/project/elements/import3.expected b/tests/cachekey/project/elements/import3.expected
index 1477e1f..ecd6f8f 100644
--- a/tests/cachekey/project/elements/import3.expected
+++ b/tests/cachekey/project/elements/import3.expected
@@ -1 +1 @@
-4a1f95eecfdddb85d7777e1222fd53f2ffec4fc8aca522d3121c5db329b5cfd4
\ No newline at end of file
+6c0b0c42d438312a775084341f99547149b6a269ef4a24122b6f75b343802877
\ No newline at end of file
diff --git a/tests/cachekey/project/elements/script1.expected b/tests/cachekey/project/elements/script1.expected
index a39f5b4..1b43ee9 100644
--- a/tests/cachekey/project/elements/script1.expected
+++ b/tests/cachekey/project/elements/script1.expected
@@ -1 +1 @@
-c034688a87a56c7bbfcb07768cdbe5972bb6bf7185bca6e0b68690e62d082221
\ No newline at end of file
+fb83946f47528e7df4d322ca1848616905d6e259e6db3cea26f906093ce519e0
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/bzr1.expected b/tests/cachekey/project/sources/bzr1.expected
index e3c1a58..a53c63a 100644
--- a/tests/cachekey/project/sources/bzr1.expected
+++ b/tests/cachekey/project/sources/bzr1.expected
@@ -1 +1 @@
-3fbc889608c104a896ed00fdad5039c78b518f030a22445e8f35c1a46f2641fe
\ No newline at end of file
+673bb938cc3fabe0be55e98c6b8b80853168becc86b4fa102fc0c538879bf83a
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/git1.expected b/tests/cachekey/project/sources/git1.expected
index 9c378a8..9fa018c 100644
--- a/tests/cachekey/project/sources/git1.expected
+++ b/tests/cachekey/project/sources/git1.expected
@@ -1 +1 @@
-06bf94e28ae33c274ecae393e67e88c8b4cd1e5273e3eefb6ea7e3a55a1aa36e
\ No newline at end of file
+53a367133fb8f3ca86ba772801ea62681414271da9582800dd56a62e9c6d7e5d
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/git2.expected b/tests/cachekey/project/sources/git2.expected
index e79512f..d9cad4d 100644
--- a/tests/cachekey/project/sources/git2.expected
+++ b/tests/cachekey/project/sources/git2.expected
@@ -1 +1 @@
-2f6e88b606b9d0a1fb89a05cb980c489af702da6916fb45aad22bc57f8c185bd
\ No newline at end of file
+86e0cf4f3154fa006899acf64317930ebf08ca6d01113abfa35ccceed2961fcd
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/git3.expected b/tests/cachekey/project/sources/git3.expected
index abbe865..df76f31 100644
--- a/tests/cachekey/project/sources/git3.expected
+++ b/tests/cachekey/project/sources/git3.expected
@@ -1 +1 @@
-5ca9393e03b7a79ec9807437355b12884f7ecbe94974aeb027e5c5e556c61af9
\ No newline at end of file
+ad5dff8a422c9de7c3d02773aeed7b425d43501ee5c2d5d13064b6f1e1ed9dec
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/local1.expected b/tests/cachekey/project/sources/local1.expected
index 64e4e9e..5cb6a19 100644
--- a/tests/cachekey/project/sources/local1.expected
+++ b/tests/cachekey/project/sources/local1.expected
@@ -1 +1 @@
-a698b669286dccb0708decaec3ea21e77a1eb1c15fe6769f0546d6dc94098f0f
\ No newline at end of file
+402b946498422abb82133fa5998b97f93b08d66ee1f332154413886687d8e7e9
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/local2.expected b/tests/cachekey/project/sources/local2.expected
index 879e7ce..e098d9b 100644
--- a/tests/cachekey/project/sources/local2.expected
+++ b/tests/cachekey/project/sources/local2.expected
@@ -1 +1 @@
-9bb8a6b3d070ecb128a9efc230541c181fc1a01b55366408178d3bbae0d19227
\ No newline at end of file
+2eff179c8bab2441c2a6f115f5c313ece4a131c067b15e7fa23b58480341550d
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/patch1.expected b/tests/cachekey/project/sources/patch1.expected
index 09ee496..c51922b 100644
--- a/tests/cachekey/project/sources/patch1.expected
+++ b/tests/cachekey/project/sources/patch1.expected
@@ -1 +1 @@
-4a469716d7d0794cc10c6b96fca464d013f666b0c963247331d95c6430736911
\ No newline at end of file
+4d2d8e8e92a20255a38d167abd93b5e6843f7b2738cdfe11ce64bc662fcaa886
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/patch2.expected b/tests/cachekey/project/sources/patch2.expected
index 108ab96..c9abff5 100644
--- a/tests/cachekey/project/sources/patch2.expected
+++ b/tests/cachekey/project/sources/patch2.expected
@@ -1 +1 @@
-5a63e9e1e4dff9396672e7ca0d601ad283d726b34c0032059abed886ee05d83e
\ No newline at end of file
+21a53c232671f21cd717a4c94274e2decdba2c916dde56e030f944fe92ae785e
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/patch3.expected b/tests/cachekey/project/sources/patch3.expected
index 6f71728..03c01c4 100644
--- a/tests/cachekey/project/sources/patch3.expected
+++ b/tests/cachekey/project/sources/patch3.expected
@@ -1 +1 @@
-f043f8b598b54510d95bf2790993bcb58e84cba0fda7880c7ea067851fa7d837
\ No newline at end of file
+5ec3023b14bb2a44c94e205d4edc0e366d187357d6661bbc699f73e014b0630b
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/pip1.expected b/tests/cachekey/project/sources/pip1.expected
index 3bfc2c9..fc24de1 100644
--- a/tests/cachekey/project/sources/pip1.expected
+++ b/tests/cachekey/project/sources/pip1.expected
@@ -1 +1 @@
-18399d7df3e760a4969ba0dd6713292904aa3232cc44858c9d3e43415d0374da
\ No newline at end of file
+60d6200ba331e3cff4b3255cb218569e387c571ee57761f6b3883b1283a937a2
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/remote1.expected b/tests/cachekey/project/sources/remote1.expected
index 0806d83..8d0c825 100644
--- a/tests/cachekey/project/sources/remote1.expected
+++ b/tests/cachekey/project/sources/remote1.expected
@@ -1 +1 @@
-fc2ca1ea82c847c136ceb3d740ef6d967029ced16374fbd05ce94e3d2d9f5432
\ No newline at end of file
+46f09da7ea078bf0d630ec2e14a668f8144df5175ee1c19c9af367873047b482
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/remote2.expected b/tests/cachekey/project/sources/remote2.expected
index 7a7d5c5..8e50da2 100644
--- a/tests/cachekey/project/sources/remote2.expected
+++ b/tests/cachekey/project/sources/remote2.expected
@@ -1 +1 @@
-9e03e1639101647fc722477cf887dc5979d9b5b2a8eee98893595517da248e1e
\ No newline at end of file
+aaa2d0c22b40d2f9b87d40ff24c37769240edba4902c50fa948e8ab6c9848f6f
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/tar1.expected b/tests/cachekey/project/sources/tar1.expected
index dc700b6..5805323 100644
--- a/tests/cachekey/project/sources/tar1.expected
+++ b/tests/cachekey/project/sources/tar1.expected
@@ -1 +1 @@
-5d7c53e3cf9f86f7ddb117b4d306ead4406381c2e14b695eb8cfbb58cb167d7a
\ No newline at end of file
+6b550e20ab7b8a11912ca14171e39c76badf7fa161a01c83d817c789b84e45c3
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/tar2.expected b/tests/cachekey/project/sources/tar2.expected
index 45b9633..bd4c41b 100644
--- a/tests/cachekey/project/sources/tar2.expected
+++ b/tests/cachekey/project/sources/tar2.expected
@@ -1 +1 @@
-22d5a9566a6d81b1cc462a8cdb45853f732ee337a2041a5a0a7f72c0637a8a7d
\ No newline at end of file
+f890b611cc83036b9c52dddf4eb2a02ccac5a73ae3ddcb34586406d7deba5a11
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/zip1.expected b/tests/cachekey/project/sources/zip1.expected
index edee1b0..892073d 100644
--- a/tests/cachekey/project/sources/zip1.expected
+++ b/tests/cachekey/project/sources/zip1.expected
@@ -1 +1 @@
-a95cda39aacfa90ab813cc2e6ec641dfd27723123d7a4f987e9b9f3d9b870cae
\ No newline at end of file
+5393d513abcc88bd1cdbf03cff65d470285a906a43cf2e192ce0770fbceb933d
\ No newline at end of file
diff --git a/tests/cachekey/project/sources/zip2.expected b/tests/cachekey/project/sources/zip2.expected
index 93a4c22..3ca0b35 100644
--- a/tests/cachekey/project/sources/zip2.expected
+++ b/tests/cachekey/project/sources/zip2.expected
@@ -1 +1 @@
-abce5ee1a61a4d446cde956ef82d221fd15f0917d61d1ddd656aabe73652eb39
\ No newline at end of file
+a03196c4878e0a585c54c0e75cabe069068d5e37b49f07ca95f5aeb6e3b1cf5b
\ No newline at end of file
diff --git a/tests/cachekey/project/target.expected b/tests/cachekey/project/target.expected
index 938b9a7..276b528 100644
--- a/tests/cachekey/project/target.expected
+++ b/tests/cachekey/project/target.expected
@@ -1 +1 @@
-60e14915e6c84da7644178b21e76d7c272506ed1f5e6a5513229215a59c4a1a4
\ No newline at end of file
+aeb288aa36ad3121822a5d5858a851670292828dedfa1840fd986bbbd59235a8
\ No newline at end of file
diff --git a/tests/frontend/buildcheckout.py b/tests/frontend/buildcheckout.py
index 50b2daf..b83fc2f 100644
--- a/tests/frontend/buildcheckout.py
+++ b/tests/frontend/buildcheckout.py
@@ -310,8 +310,8 @@
     result = cli.run(project=project, args=['build', 'checkout-deps.bst'])
     result.assert_success()
 
-    checkout_args = ['artifact', 'checkout', '--directory', checkout,
-                     'test/checkout-deps/602d6859b2e4bdc2af7f3ff34113c4e49219291c0b5c3be8642f85e94322ce49']
+    key = cli.get_element_key(project, 'checkout-deps.bst')
+    checkout_args = ['artifact', 'checkout', '--directory', checkout, 'test/checkout-deps/' + key]
 
     result = cli.run(project=project, args=checkout_args)
     result.assert_success()
@@ -332,8 +332,8 @@
     assert os.path.isdir(builddir)
     assert not os.listdir(builddir)
 
-    checkout_args = ['artifact', 'checkout', '--deps', 'none', '--tar', checkout,
-                     'test/checkout-deps/602d6859b2e4bdc2af7f3ff34113c4e49219291c0b5c3be8642f85e94322ce49']
+    key = cli.get_element_key(project, 'checkout-deps.bst')
+    checkout_args = ['artifact', 'checkout', '--deps', 'none', '--tar', checkout, 'test/checkout-deps/' + key]
 
     result = cli.run(project=project, args=checkout_args)
     result.assert_success()
@@ -355,7 +355,7 @@
     assert not os.listdir(builddir)
 
     checkout_args = ['artifact', 'checkout', '--deps', 'none', '--tar', checkout,
-                     'test/checkout-deps/602d6859b2e4bdc2af7f3ff34113c4e49219291c0b5c3be8642f85e94322ce48']
+                     'test/checkout-deps/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa']
 
     result = cli.run(project=project, args=checkout_args)
     assert "seems to be invalid. Note that an Element name can also be used." in result.stderr