Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable instant DID use/resolution for DID Methods that include a propagation delay #70

Closed
csuwildcat opened this issue Oct 14, 2019 · 81 comments
Assignees
Labels
discuss Needs further discussion before a pull request can be created needs special call Needs a special topic call to make progress pr exists There is an open PR to address this issue

Comments

@csuwildcat
Copy link
Contributor

In Sidetree-based DID Methods, there are two forms of ID strings for the same identifier:

Long-Form ID: Base64_Initial_DID_Doc
Short-Form ID: SHA256_Hash_Of_Base64_Initial_DID_Doc

The use case for this is that in more robustly decentralized systems, commitment is delayed by consensus, which can take 30 seconds, or even minutes. That said, there is still a desire to immediately use an ID, which is what the Long-Form ID above allows. By passing the Long-Form ID to an RP or Issuer, the system can resolve the ID to its latest state (assuming it is registered and can be found by its Short-Form equivalent), or, if it has not yet been registered/broadcast, it can resolve via return of the initial DID Document that comprises the ID string.

Presently the DID spec seems to prohibit Methods from supporting multiple ID string forms of the same DID with the language found in the Binding of Identity section:

Proving control of a DID, i.e., the binding between the DID and the DID Document that describes it, requires a two step process:

1. Resolving the DID to a DID Document according to its DID method specification.
2. Verifying that the id property of the resulting DID Document matches the DID that was resolved.

We would like to support the notion of both forms being equivalents, given the Long-Form hashes to the Short-Form, making them provably synonymous. Was the DID spec written with this in mind, or is this something new to consider?

@OR13
Copy link
Contributor

OR13 commented Oct 14, 2019

The section on equivalence, appears to describe similar functionality.

If it were not for the language mentioned above, defining equivalence within a DID Method would be up to the method implementer it would seem.

The Long-Form ID has similarities to did:key or other self certifying methods such as did:ethr, given a Long-Form ID, it should be possible to verify a JSON-LD Signature attributed to it, because the identifier contains key material.

To summarize again, it might be desirable for some DID Methods to support multiple DIDs that resolve to the same DID Document, where that document always contains a Short-Form ID.

@talltree
Copy link
Contributor

@OR13 You are exactly right, that is the reason we included Equivalence in the Future Work session. @csuwildcat's use case is indeed a good example of when equivalence assertions are needed, however it is actually one of the easier ones since:

  1. Both DIDs asserted as equivalent would be defined by the same DID method.
  2. Equivalence can be proved algorithmically.

The reason we put Equivalence in the Future Work section is that it can be considerably harder to prove equivalence across DIDs from different methods where there is no direct algorithmic proof.

I personally favor tackling at least intra-method equivalence in the DID spec. I could also support defining at least one straightforward method of achieving inter-method equivalence. But I would not make it a top priority.

@peacekeeper
Copy link
Contributor

So it seems the key question is: If you resolve did:ex:1234, could you get back a DID Document with an id that is different from did:ex:1234? Right now the spec doesn't allow that, and I feel it would be problematic from a URI/RDF perspective.

Instead, my feeling was that the DID Document would include an equivalence statement, or redirect statement, that points to the new DID.. E.g. if you resolve did:ex:<long-form>, you would get:

{
  "@context": "https://w3id.org/did/v1",
  "id": "did:ex:<long-form>",
  "redirect": "did:ex:<short-form>",
  .. services and public keys ..
}

Semantically, there's a slight difference between stating "equivalence" and "redirect". The former would be a bit like an owl:sameAs statement in RDF, whereas the latter would be a bit like an HTTP 303 code. Mastodon has a property as:movedTo for redirecting to a new account.

The above would instruct a client to use did:ex:<short-form> from now on.

Also see w3c/did-resolution#36.

@msporny msporny added the discuss Needs further discussion before a pull request can be created label Oct 15, 2019
@csuwildcat
Copy link
Contributor Author

Given the veracity of a DID Document is determined by the process/proofing done within the DID Method itself, why is there a need to pose this as a redirect? Redirect sounds more like a pointer to something distinctly different, not the exact same ID. Can we at least call this something besides redirect, given the IDs in Sidetree-based DID Methods, for example, are exact equivalents that represent the exact same ID in the system. I like equivalent or alias, personally.

@csuwildcat
Copy link
Contributor Author

Markus and I talked a bit, and he made a good point: this ask is dealing with a unidirectional relationship between variations of the same ID. Markus mentioned that XDI had a canonical value that expressed this sort of relationship - would folks here be open to adding a canonical property that, if present, indicates a unidirectional pointer to the canonical form of the ID the resolving party should use going forward?

@peacekeeper
Copy link
Contributor

Markus mentioned that XDI had a canonical value that expressed this sort of relationship

Quick correction.. What I said was that XRDS (not XDI) had a <EquivID> and a <CanonicalID> element. The latter was unidirectional, and you could have only one of it. In XDI, very similar constructs exist, they are called $is and $ref.

@csuwildcat
Copy link
Contributor Author

csuwildcat commented Oct 16, 2019

After talking with several folks, there may be a better way to address the needs of methods that have a period of delay between generation of a DID and the finalization of the DID on whatever ledger/chain, etc., their network uses:

The proposal is to create a new Generic DID Parameter: init, and a DID Resolution metadata field: published. These two items would include the following specification language and directives:

  • init - Value(s) a DID Method and its resolver code may utilize to process DIDs that are in an 'unpublished' state, not yet anchored/propagated in the underlying trust system a Method uses.
  • published - Boolean applied by the DID Method's resolving code indicating whether or not the DID that was resolved has been anchored in the underlying trust system. When this metadata field is returned true from the resolving code, the party performing the resolution MAY choose to discard the init parameter from any held references to the DID in question.

@csuwildcat
Copy link
Contributor Author

If there are no objections, I intend to fork the current spec and create a PR for the addition of the init Matrix Parameter to the Generic DID Parameter list. Please respond with any feedback about this direction before the next WG meeting to ensure we fully consider all points of view.

@csuwildcat csuwildcat changed the title Allow for DID Methods that support multiple forms of the same identifier Allow for instant DID use/resolution for DID Methods that include a propagation delay Oct 18, 2019
@csuwildcat csuwildcat changed the title Allow for instant DID use/resolution for DID Methods that include a propagation delay Enable instant DID use/resolution for DID Methods that include a propagation delay Oct 18, 2019
@peacekeeper
Copy link
Contributor

This probably requires some review from the wider WG, but in general I think this could be a useful feature that makes sense across multiple DID methods. So let's start a PR to try and get some more feedback.

@OR13
Copy link
Contributor

OR13 commented Oct 18, 2019

There was a discussion about a similar approach for did:git at IIW. I like the language for init. I don't fully understand the other side published or how a method resolve interface is able to respond to matrix parameters generally.

@csuwildcat
Copy link
Contributor Author

csuwildcat commented Oct 18, 2019

@OR13 the published metadata field is something the DID Method's resolving code would be aware of and include when it resolves a DID. This resolution metadata field would always be populated by methods that seek to employ it, and would be present regardless of whether or not the init Matrix Parameter was included on the DID being resolved. Just think of published as a generic indicator that all Methods can use for signalling the anchored/not anchored state of a DID, irrespective of this particular utilization of that indication.

@thehenrytsai
Copy link

Can we consider renaming init to initial-values or initial-state as init typically means "initialize" or "initialization" in the programming world?

@csuwildcat
Copy link
Contributor Author

@thehenrytsai of the two you mentioned, I like initial-values.

@peacekeeper
Copy link
Contributor

I wonder if init could be generalized to specify a DID document that is returned not only until the DID is anchored/propagated, but also if for some other reason the DID cannot be resolved. The parameter could be called fallback or default instead of init. But I guess the behavior I am describing is a bit different than what you have in mind.

@peacekeeper
Copy link
Contributor

I don't fully understand the other side published or how a method resolve interface is able to respond to matrix parameters generally.

+1 I don't understand that either. It's confusing the say a matrix parameter is "returned". Perhaps what you really want here is resolver metadata, or a DID document extension?

@csuwildcat
Copy link
Contributor Author

I wonder if init could be generalized to specify a DID document that is returned not only until the DID is anchored/propagated, but also if for some other reason the DID cannot be resolved. The parameter could be called fallback or default instead of init. But I guess the behavior I am describing is a bit different than what you have in mind.

I don't think you can use this in a 'fallback' sense, because the initial values present in the parameter may describe a state that is only secure and valid during the unpublished/propagated phase. This means that making it a fallback would be insecure for any DID that had changes made to it since, because it would wrongly indicate that the resolving party could rely on the initial values, which may, for example, include keys that have since been removed.

@csuwildcat
Copy link
Contributor Author

I don't fully understand the other side published or how a method resolve interface is able to respond to matrix parameters generally.

+1 I don't understand that either. It's confusing the say a matrix parameter is "returned". Perhaps what you really want here is resolver metadata, or a DID document extension?

Sorry that I mixed this up - what I meant is that published is a field in the resolved metadata, which the DID Method's resolving code would return (because obviously it is the thing aware of whether a DID has been published/anchored).

@OR13
Copy link
Contributor

OR13 commented Oct 18, 2019

@peacekeeper whats the relationship between the did resolution spec:

https://w3c-ccg.github.io/did-resolution/

And this working group again?

It seems like the addition of a generic matrix parameter would be very much in scope for this group, but a method specific one, wouldn't need any changes.

I'm very much in favor of standardizing the process of providing initial data to a resolver, and I think it would be nice if it were generic, but if method specific resolvers are making the decision of when to use the resolution meta data to forward related info, it feels like maybe the initial-values is a method specific matrix param.

Seems like we could do:

A. Generic matrix param + DID Document Extension
B. Method Specific Matrix Param + Resolver Meta Data

A seems definitely in this working group, I'm not sure about B, but it seems like its potentially less difficult to accomplish.

@peacekeeper
Copy link
Contributor

peacekeeper commented Oct 18, 2019

@OR13 right now the DID spec (identifier syntax and DID document data model and format) is being developed by the DID WG, whereas the DID Resolution spec (resolving and dereferencing) is a work item of the CCG. This is under active discussion right now, since we often find that topics in both groups are closely related. Matrix parameters are one such topic, and there are others as well.

I do think this proposal would be a generic matrix parameter rather than method-specific. Generic doesn't mean that all methods have to support it. It just means that it should have the same semantics across those methods that DO support it.

@cboscolo
Copy link

+1 I do think this proposal would be a generic matrix parameter rather than method-specific.

@csuwildcat
Copy link
Contributor Author

csuwildcat commented Oct 18, 2019 via email

@yancyribbens
Copy link
Contributor

+1 also that this request would be part of the DID resolution protocol. Also, it seems like the default param would be published if not specified. If ledgers and chains that use a more decentralized protocol that requires propagation, then initial-values can be used.

@OR13
Copy link
Contributor

OR13 commented Nov 26, 2019

Initial values in sidetree spec:

https://github.com/decentralized-identity/sidetree/blob/ae54238411245a55edeeda992e3dbcc6af1ffbc4/docs/protocol.md#unpublished-did-resolution

did:sidetree:<unique-portion>;initial-values=<encoded-original-did-document>

@jonnycrunch
Copy link
Contributor

wouldn't this lead to a race condition and/or eclipse attack if I trick the validating party into thinking that there are init values when it isn't a new DID doc?

@csuwildcat
Copy link
Contributor Author

To use Sidetree methods as an example, their DID identifier strings are made up of the following:

did:ion: RECOVERY_PUB_KEY : INITIAL_STATE_HASH : COMMITTMENT_HASH

If you were to change any of those identifier values, you would be dealing with a different DID, thus when you tack on the initial state values via a matrix param, as follows:

did:ion: RECOVERY_PUB_KEY : INITIAL_STATE_HASH : COMMITTMENT_HASH:initial-values:INITIAL_STATE_DATA

^ This way you have cryptographic certainty that the person who controls the keys/values bound to to that particular DID identifier string is the controller. If someone were to tack on a different initial-values payload that didn't match the identifier string's INTIAL_STATE_HASH, you would immediately know it is invalid.

@csuwildcat
Copy link
Contributor Author

csuwildcat commented Feb 26, 2020

If not every method needs it, why does it need to be a generic method matrix parameter?

Yeah, this is a tough one, because we know multiple methods do need it, and I would bet dollars to doughnuts more future methods that have nothing to do with how Sidetree works will face the same general constraints imposed by underlying ledger systems, for which this is a generic solution that allows instant use of their DIDs regardless of what your specific DID Method's initial-values are. The fundamental question then becomes: does a generic matrix parameter literally need to be so generic that all methods must/will likely use them, or is it ok to create generic matrix parameters that some subset of all known DID Methods use in the same generic way? I would argue the latter is more sane, because hardly any parameters are truly so universal that all methods can/must/will support them. <-- @peacekeeper, what do you think?

@kdenhartog
Copy link
Member

kdenhartog commented Feb 26, 2020

Even without the time delay concern, this is useful for leaving the did off ledger until an update is necessary. In other words, this makes creating a DID free initially. This is why I believe most methods will want to use it.

@kimdhamilton
Copy link
Contributor

fwiw, this concept is also useful for btcr. We just haven't dug into this yet.

@peacekeeper
Copy link
Contributor

or is it ok to create generic matrix parameters that some subset of all known DID Methods use in the same generic way

I agree with this. Some generic parameters work with all DID methods (e.g. the service one which operates on the DID document - every DID method has DID documents!). Other generic parameters are only supported by some DID methods, but if they are supported, then they have the same meaning across those methods.

Besides initial-values, another example is version-id and version-time: Not all DID methods support the lookup of previous versions of a DID document, but if they do, then the meaning of the parameters is consistent.

@gjgd
Copy link
Member

gjgd commented Feb 27, 2020

@kdenhartog

this makes creating a DID free initially

Only if you're assuming that everybody who wants to resolve the did will know the initial state information which may not be the case.

@csuwildcat
Copy link
Contributor Author

@kdenhartog

this makes creating a DID free initially

Only if you're assuming that everybody who wants to resolve the did will know the initial state information which may not be the case.

I am not sure what you mean - initial-values IS the initial state information, which you would be handing anyone you would like to resolve the DID. For this reason, I don't see anything inaccurate about what Kyle wrote.

@gjgd
Copy link
Member

gjgd commented Feb 28, 2020

If you assume that people can only know about or want to resolve a DID if the DID controller handed them the DID (with the initial state information) then yes the statement is accurate.

For Sidetree, this assumption makes sense because how else is anyone supposed to guess a DID, however this may not be the case for all DID methods. Some don't cryptographically tie the unique suffix with the initial state information.
For example if you use did:github:, I can know your DID by knowing your Github name. If you use did:ethr I can know your DID by knowing your Ethereum address.

Hence my point: Using initial-values makes creating a DID free initially, only if the people who would want to resolve the DID know directly or indirectly the initial state information from the DID controller.

@csuwildcat
Copy link
Contributor Author

csuwildcat commented Feb 28, 2020

@gjgd

If you assume that people can only know about or want to resolve a DID if the DID controller handed them the DID (with the initial state information) then yes the statement is accurate.

Yes, this is what this mechanism is for.

For Sidetree, this assumption makes sense because how else is anyone supposed to guess a DID, however this may not be the case for all DID methods. Some don't cryptographically tie the unique suffix with the initial state information.

Yes, other Methods may not be able to provide this useful feature, due to limitations inherent to them.

For example if you use did:github, I can know your DID by knowing your Github name.

Yes, GitHub is a centralized database, so it can be updated very quickly, and delete your account, screw up your data, or do any number of negative things very quickly as well. With a mechanism like this, Sidetree and other methods that are capable of this generic concept are able to provide secure, immediate resolvability of newly created DIDs (and potentially even 'anchored + 1' states) in a robustly decentralized way, all without the downsides of a centralized Method, like Github DIDs.

If you use did:ethr I can know your DID by knowing your Ethereum address.

Yes, methods like did:ethr and did:key sort of do this (obviously you can resolve a key from something that directly attaches a key), but not in a way the supports the same features this adds. Ironically, it looks like did:ethr could actually enhance their method using this matrix parameter mechanism as well.

@gjgd
Copy link
Member

gjgd commented Feb 28, 2020

Regarding your last two points, did:github and did:ethr were taken as examples of did methods that don't cryptographically tie their did unique suffix to the initial state. Obviously I'm not comparing them to Sidetree from a security perspective, nor am I starting an argument about centralized VS decentralized ledgers...

I do remain concerned about the point made earlier:

Even without the time delay concern, this is useful for leaving the did off ledger until an update is necessary. In other words, this makes creating a DID free initially. This is why I believe most methods will want to use it.

IMO Initial-values is a useful feature than solves an important business problem when there is a propagation delay concern, but should not be an excuse to do away with ledgers until an update is necessary for mainly two reasons:


That being said, I'm in favor of initial-values being a generic method matrix parameter, even if it won't be pertinent for every did methods. There is a lot of did documents values that are defined in the did-core spec but that not every did methods will use, I think that's fine.

That does however brings the question: Do we need a standard way to verify that the did corresponds to the initial-values parameter, or can that be method specific?

@kdenhartog
Copy link
Member

Given the discussing occurring in #159 I'd suggest we put this discussion on hold until a decision is made there.

@jandrieu
Copy link
Contributor

@csuwildcat and I came up with an approach that may enable his use case without requiring an extra labeled parameter. I'd like to float that idea here to see how others feel about it.

The specific idea is to separate the method-specific identifier into components for which only the first element is considered the unique identifier for the entity. The latter components are optional and their meaning method specific.

For convenience sake, I'm assuming a colon is a suitable separator. This would require an adjustment to the ABNF, but that an implementation detail we can figure out later.

For example,
did:ex:abc:123

Would refer to the entity identified by did:ex:abc, with the initial state of 123 (assuming the method treats the additional component as an initial state). Any credentials issued to the entity would be free to use the "short form" of did:ex:abc, since that uniquely defines the identifier.

I believe this relaxation of the meaning of a method-specific id would give DID method creators a flexible, optional means for including the initial state of a DID Document in the DID URL itself, without the need for labeled parameters, matrix or otherwise.

Another way to think about this pattern is that the DID URL basically says
did:ex:id:data

In the case of side-tree that id part is deterministically derived from that data so if the registry-based lookup returns no result, the data part can be verified against the id and treated as the DID Document itself. This makes the DID-URL sort of a data: style URL carrying its content with it (where that content is the initial state of the DID Document).

In short, each DID method would be free to specify an initial subset of the method-specific identifier as an entity ID, usable for all references to that entity, while using the balance of the method-specific identifier for additional information, such as initial state. Or the DID method could simply define this extra part is not used.

My initial recommend is that only that the id part have consistent semantics across methods. The meaning of the data part, IMO, could be method specific, and as such always optional. Although, standardizing its use for "initial state" may prove useful.

@peacekeeper @msporny @talltree Does this relaxation of the method-specific identifier violate any deeply held notions of what a DID means?

@csuwildcat
Copy link
Contributor Author

@jandrieu I still think the A+ is to see if we can get some sort of param agreement that we can utilize for this. Also, I thought about it and it's going to be hard to make assumptions about DID colon-separated segments, because there's a broad range of uses. For example: we just agreed to add did:method:test:ID_SUFFIX as the way to note the difference between test/prod network IDs in a family of methods folks are developing, which means any other path assumptions may be fraught for this or similar segment uses by other groups. Params are my first choice, with anything else being less-than. I'm happy to wait on this and just proceed with the param discussion.

@msporny
Copy link
Member

msporny commented Mar 24, 2020

@peacekeeper @msporny @talltree Does this relaxation of the method-specific identifier violate any deeply held notions of what a DID means?

This is essentially the approach taken by the Hashlink spec (content_id:content_meta), except that in this case, you're prepending a global identifier and placing the content identifier after it (global_id:content_id:content_meta).

Raises the question why you couldn't just use a hashlink here, as hashlinks enable you to encode the data in the content_meta if you so desired.

In any case, feels like a workable solution for those that want initial_params with the caveats that @csuwildcat mentions above.

@dlongley
Copy link
Contributor

This approach does seem problematic for DID methods already using did:method:test:id and did:method:method-specific-thing:id. These should not be understood to be the DIDs did:method:test and did:method:method-specific-thing, respectively.

@jandrieu
Copy link
Contributor

@dlongley Right. That's an issue. And if we allow the method to independently set which part of the method-specific id, then we don't have interoperability.

If that's not a reasonable solution, then, to @csuwildcat's dismay, I'll have to say I still don't find a compelling reason to put the meta-data in the URL itself. If the DID-URL recipient has a short time preference for resolution, then there is guaranteed to be a matching short-time-preference communication channel through which they received that URL. The initial state can easily be published through the same channel. For example, by wrapping it in a JSON payload:

{
   did: "did:ex:abc",
   initialState: "WHATEVER YOU WANT"
}

Just like VCs didn't depend on the eventual realization of DIDs, nor did they require specific crypto suites, there's no need, IMO, to put an initial state in the URL when the use cases that need such a feature can achieve it through the same communication channel already in place. In short, we are conflating meta-data that is useful but communicable through other means with the data required to use a DID at all. This feels like an optimization parameter one might send to a resolver rather than a requirement for the DID to work at all.

To wit: if the DID is going to be presented in a long-time-preference medium (blog post, business card, billboard, video credits, etc.), then there is no advantage to initial state. The initial state is useful when and only when there is a relatively short period of time between DID registration and DID resolution. That short time period implies that there is a communication channel, which could easily afford @csuwildcat his needed initial state without the burden of parameters (matrix or otherwise).

@csuwildcat
Copy link
Contributor Author

csuwildcat commented Mar 24, 2020

I disagree with @jandrieu's last statement of apparent certainty about this use case, the needs that motivate it, or the issues with sending strings required for resolution via random, non-standard communications channels/payloads. I only needed to say that so folks would not walk away thinking Joe's comments accurately reflect the technical needs and implications of this use case, or the view of most folks involved in these developments. That out of the way, I don't feel this Issue should be the place where we continue to discuss this need; I would suggest instead that we all focus on settling the issue of including a parameter mechanism (which the bulk of the community seems to be in favor of), given it would solve this Issue without any further discussion of this particular usage.

@OR13
Copy link
Contributor

OR13 commented Mar 24, 2020

There are features which some of us need, which are fulfilled via DID Parameters.

Regardless of the mechanism for delivering these parameters, some of them will be used at resolution time.

DIDComm, Sidetree, DIDPeer, and this proposal for did:key all take this approach:

w3c-ccg/did-method-key#5

Since the specifics of DID Method Implementation are outside of this WG, we cannot create statements in the core spec, about what a Method can and cannot do with a did parameter... we know that they will be available to the method at the time of resolution, and we know we are not in control of defining the specific process of resolution in for example: did:ion, did:elem, did:peer, or did:key...

How a method handles what comes after the method... is the methods business... and people are already relying on this behavior today:

https://github.com/decentralized-identity/ethr-did-resolver/blob/develop/doc/did-method-spec.md

I think this issue has become about things that are none actionable, and is blocked... entirely... by the matrix parameter discussion, and agreement that method implementers are free to define how a method is implemented.

I suggest we close this issue, have the discussion regarding DID parameters, and acknowledge that any handling of DID Params that is method specific, is outside of the control of this WG, and cannot be blocked by this wg, so long as the format of the parameters complies with the did core spec.

@csuwildcat
Copy link
Contributor Author

As the one who opened this issue, I don't see any further need to discuss it at this level, given the eventual mechanism it would rely on is far more general. Furthermore, as Orie notes, this is not something the WG or its members should dictate to Method implementers, so once we have a solution for the variant of parameters DIDs can use to pass resolution-related values of any kind, it will naturally satisfy this need.

@csuwildcat csuwildcat reopened this Oct 8, 2020
@csuwildcat
Copy link
Contributor Author

Reopening, as the direction/mechanics of parameters cannot fulfill the need.

@msporny
Copy link
Member

msporny commented Nov 1, 2020

This issue is related to #431 and will be resolved once that issue is resolved. This issue needs a special topic call. This is a high priority issue before CR as it could affect normative sections of the specification.

@msporny msporny added needs special call Needs a special topic call to make progress pre-cr-p1 labels Nov 1, 2020
@msporny
Copy link
Member

msporny commented Nov 24, 2020

This will be resolved once PR #431 is merged in.

@peacekeeper peacekeeper added the pr exists There is an open PR to address this issue label Nov 25, 2020
@msporny
Copy link
Member

msporny commented Dec 6, 2020

PR #431 has been merged via PR #473; closing.

@msporny msporny closed this as completed Dec 6, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
discuss Needs further discussion before a pull request can be created needs special call Needs a special topic call to make progress pr exists There is an open PR to address this issue
Projects
None yet
Development

No branches or pull requests