Closed vojtech-kovar closed 3 months ago
Is this related to #97?
Yes -- sorry for not mentioning that before, and thanks you volunteered for reviewing :) We had a discussion about that at the meeting today after you left, and there will be some changes -- so maybe wait with the review after I implement the changes (tomorow or Monday, I hope).
notes from today's meeting:
feel free to add if I forgot anything
I have some doubts about this scheme:
collocateMarker
and etymology
both have one optional unique property, that may be missing, so in this case their identity translates to an empty string.definition
has only text
as its unique property, this may lead to a very long identifier as definitions can be quite substantial in a dictionarylistingOrder
is not used as a property, but would be the obvious choice for many elements. e.g. currently we would have something like http://www.example.com/lexicon/entry/cat~1~noun/sense/small+furry+animal and this could be simplified to http://www.example.com/lexicon/entry/cat~1~noun/sense/1cat~1~noun
or cat~noun~1
Thanks for the notes, let me add my thoughts:
- Some elements can be assigned ambiguous empty IDs:
collocateMarker
andetymology
both have one optional unique property, that may be missing, so in this case their identity translates to an empty string.
Not sure if I understand correctly: Do you mean e.g. two different etymology
objects under one entry, both with missing description
? According to my understanding of UNIQUEness, this should not be allowed -- because once two objects at the same level miss a UNIQUE identifier, it is no more UNIQUE, the objects cannot be distinguished by this property. (NB there is the same situation with sense
, both UNIQUE properties are also OPTIONAL.) If a property is marked both UNIQUE and OPTIONAL, I understood it's because we want to allow a single etymology
(or sense
) without description
(or definition
) under each entry
, not multiple. Am I reading it wrong?
It could anyway be stated more explicitly in the description of UNIQUEness.
- Some IDs will be very long:
definition
has onlytext
as its unique property, this may lead to a very long identifier as definitions can be quite substantial in a dictionary
Yes, that's right -- I've asked about it and we have discussed this at the meeting after you left, and even considered an option of some hashing, but we agreed we prefer readibility and transparency to compression.
listingOrder
is not used as a property, but would be the obvious choice for many elements. e.g. currently we would have something like http://www.example.com/lexicon/entry/cat~1~noun/sense/small+furry+animal and this could be simplified to http://www.example.com/lexicon/entry/cat~1~noun/sense/1
I am against using listingOrder
-- you are right it would be easy to use (and short), but if you use it as a link and then the listing order changes without changing the link (which can happen anytime if the resource is not frozen), the link will still work (i.e. nobody will notice anything, everything will be valid etc.) but it will point to a wrong object. I think we want to avoid that.
- The order of elements with multiple properties is not clear, e.g., should it be
cat~1~noun
orcat~noun~1
That's right, thanks for spotting -- I will state that explicitly.
- It should be noted that the second case (single unique property, arity=1, value is an object) actually does not occur in the spec
OK
- We should give the result of applying this schema along with each element definition
I can do that, too, I just didn't want this feature be over-presented (maybe it's not that important :) ) -- what do others think?
I have now implemented the changes we agreed on, please review if you can :)
I understood it's because we want to allow a single etymology (or sense) without description (or definition) under each entry, not multiple. Am I reading it wrong?
In fact, it is possible to have multiple etymologies without description under the same entry, this is the problem.
Another issue is that the fields are not identified so in some cases the identifier may be ambigous
<entry>
<headword>foo</headword>
<sense>
<indicator>x</indicator>
</sense>
<sense>
<definition>x</definition>
</sense>
</entry>
Both resolve to http://www.example.com/lexicographicResource/entry/foo/sense/x
Comment on empty specifiers should be added before acceptance of this PR
A couple more potentially ambiguous results.
<entry homographNumber="0">
<headword>test</headword>
</entry>
<entry>
<headword>test</headword>
<definition>0</headword>
</entry>
<pronunciation soundFile="x"/>
<pronunciation>
<transcription>x</transcription>
</pronunciation>
I checked the others :)
One further comment, not even sure if this a bug, but it is not possible to construct a fragment identifier for member
as there are not unique properties for relation
One further comment, not even sure if this a bug, but it is not possible to construct a fragment identifier for
member
as there are not unique properties forrelation
Yes, that's correct -- the procedure cannot live without the UNIQUE identifiers. I tried to say it by the following sentence:
DMLex does not define the structure of IRIs for object types without UNIQUE properties.
should I add anything to it?
relation
?)I am against using listingOrder -- you are right it would be easy to use (and short), but if you use it as a link and then the listing order changes without changing the link (which can happen anytime if the resource is not frozen), the link will still work (i.e. nobody will notice anything, everything will be valid etc.) but it will point to a wrong object. I think we want to avoid that.
I see this problem with listingOrder, but currently we also change the URI every time a unique element (e.g., definition) changes, and this is tricky to implement in a dynamic web application use case. We could allow listingOrder
to be used in an XPath-like syntax so we could refer to a sense as
EITHER
http://www.example.com/lexicon/entry/abandon~0~verb/sense/0~/to%20suddenly%20leave%20a%20place%20or%20a%20person/
OR
http://www.example.com/lexicon/entry[1]/sense[1]
I have thought about this over the weekend and I see four key issues with the proposal as it stands
listingOrder
, changes to the data change the identifier, and so the identifiers are unstable. This is a general problem with this scheme. For example, a minor change to a definition would require updating the parent element's ID (sense
), siblings' IDs (example
) and all incoming links. I think this is technically very challenging (in conflict with @michmech's vision of the model) and can probably only be implemented by search/replace/hope or using another internal identifier scheme (in which case what is the point of this?).word~0~noun
) even when not needed and adding 0~
in many places. Aesthetics are not a showstopper, but they will certainly limit the adoption of this modelAs solutions, I see the following approaches
#
symbol in a URI is important technically and I am not sure how we define enough modelling to allow implementers to put it anywhere. An alternative would be to not define full IRIs, but make this something like XPath for DMLEX, but not tied to the XML serialization. However, even if we solve Issue 1, Issue 2 seems fairly intractable and I don't think we avoid Issue 3 and 4 without a radical redesignsense
, entry
and collocateMarker
xml:id
in XML serializationThis discussion gets repetitive so let me just summarize why most of the objections are either false or largely missing the point of this PR.
First of all it needs to be emphasized that the specification is very clear about the fact that it describes an addressing mechanism on the model level and then there are serialization-specific addressing mechanisms which anyone is free to use (this would be e.g. XPath/XQuery for XML).
This answers Objection number 1, because if we are talking about static hosting of data files, those files are necessarily serialized in some format, and then a serialization-specific addressing mechanism should be used. It is therefore false that this use case is not supported, on contrary there are a number of options to choose from, and all are depending on a particular serialization format. It shall be emphasized too that coercing model-level descriptions towards particular serialization is a malpractice to be avoided.
The Objection number 2 says "PR requires data producers to adopt a particular IRI scheme" which is not true (it is optional), and generally completely ignores the primary motivation behind a model-level addressing mechanism, i.e. being able to address without the restrictions of any particular serialization method. This objection for reasons not explained instead keeps talking about a request-response processing mechanism, which again, is not the primary motivation behind the addressing, and can be easily done using any serialization-specific addressing mechanisms. Again, the primary motivation of the model-level addressing is to point to a particular DMLex object in serialization unspecific way; not defining a request-response round-trip.
The issues described in Objection number 3 were also discussed multiple time and they are not very relevant to this PR. All this is intentional and in line with best lexicographic as well as data maintenance practices to prevent unintentional data degradation. The principles of DMLex are to remove processing complexity where it is not necessary, not where we would arbitrarily wish to do so. The fact that many tools currently to dot exercise these integrity checks suggests that it is even more so important to promote it in the standard.
Objection number 4 is true but it is important to realize that the links are not meant to be human-processed, or human-presented in the full form. They would be machine processed and visualized in implementation-specific ways that will suite the user/device/situation context. So yes, the links could be sometimes long a ugly, but also in many cases rather short and easy to interpret.
To sum up, I find all the objections completely invalid and do not understand the motivation behind bringing them again and again without any reasonable justification.
You are asking why this is important, so I will try to reiterate this:
In the beginning of all this we wanted recommended addresses for all DMLex objects, based on the data (and namely the values of the UNIQUE properties), not arbitrary IDs, nor a particular serialization. It was all about (and only about) suggesting unique identifiers, not prescribing how they should behave if used in HTTP requests or in any other particular scenario. I get it now that @jmccrae does not like this very principle (to put it mildly), on the other hand we agreed we will do it in a meeting with all of us present, so I took it as agreed.
It was crystal clear from the very beginning that it is not possible to devise a method of addressing that will guarantee that all the possible use cases will work out of the box. I am pretty sure that we cannot even predict any substantial part of the possible use case scenarios, we can just bring some arbitrary examples.
But now we are (John is) bringing one arbitrary use case after another and argue it does not work out of the box for them. Well, it doesn't. It is not possible to satisfy everyone. (And I don't like trying to satisfy all the use cases we can think of, especially by complicating the DMLex model itself, like we did on the last meeting with the new property deciding if '/' or '#' is used. None of the use cases, nor the whole addressing itself, is so important that it would be worth making the model more complex.)
So, instead of fiddling with arbitrary use cases, I think we should answer the main question: "Do we want a model-level mechanism as described in the first paragraph, even though it does not satisfy all the use-cases perfectly?" Do we?
I think the model-level addressing brings a choice: either use this, even if it requires some extra effort with particular formats/setups, or use a serialization-specific addressing and/or their own IDs if it's more convenient. The advantage of the former option would be universality (indepedence on a particular resource, its serialization format and arbitrary IDs -- if you are e.g. a dictionary aggregator, this could make you happy) and readability (even if the address leads to nowhere, a human is able to decode/fix it, unlike an address with arbitrary IDs.) Of course, we can as well decide to drop all this (John's option 3, and also the current status) which leaves only the latter option.
@michmech @DavidFatDavidF please comment
I think that this is getting a bit out of hand for what is a small part of this overall great project. When summarising the issues discussed in this long thread I have been accused of "bringing them again and again without any reasonable justification" and by defining three use cases I am accused of "bringing one arbitrary use case after another". Can we chill it please?
As I have made clear, I am open to compromise (Option 2) although as is clear, my personal opinion is that user-defined identifiers (Option 3) would be superior to content-based ones.
These concerns are based on blocking technical issues that have become clear to me from implementing this system and I have outlined them clearly above.
To implement the compromise option (Option 2) I would propose the following text:
<para>Every top-level model object may be assigned one or more identifiers
that uniquely determines the path in the DMLex tree structure. These can be used to construct IRIs, by
appending them to the IRI of the root object. The IRI of the root element is the value of its attribute <literal>lexicographicResource.uri</literal>, converted to IRI according to the algorithm specified in
[<link linkend="bib_rfc3987">RFC 3987</link>]. IRIs can be constructed in a schemes such as
follows:</para>
<para><literal>lexicographicResource.uri/objectTypeName/objectID</literal></para>
<para><literal>lexicographicResource.uri#objectTypeName/objectID</literal></para>
<para>Other schemas may be adopted by applications. This standard does not mandate the adoption of any
IRI schema or describe what kind of resources are located by IRIs constructed in this way.</para>
etc...
Then all examples are changed so that they do not include the HTTP URI (e.g., entry/cat~1~noun/sense/0~small%20furry%20animal
instead of http://www.example.com/lexicon/entry/cat~1~noun/sense/0~small%20furry%20animal
). We continue to define objectIDs but do not define IRIs based on them. Our identifiers no longer start with http
and thus don't depend on a serialization.
This satisfies Problem 1, as it is much more vague and does not mandate a URI schema so more use cases can be satisfied. Problem 2 is mostly side-stepped as this proposal now doesn't require anything of producers or consumers of data. I also think it is closer to what @mjakubicek has in mind, as he doesn't want a "request-response" mechanism based on serialization, while an HTTP URI requires that you can make an HTTP request and receive a serialized response.
I would also reiterate the proposal to also allow object IDs by listingOrder
EITHER
entry/abandon~0~verb/sense/0~to%20suddenly%20leave%20a%20place%20or%20a%20person
OR
entry_1/sense_1
The adoption of listing order as an alternative mechanism would solve Problem 4, and Problem 3 would be reduced as implementers can choose the option that is more stable for their application.
I am happy to turn this into a PR if others are happy with this.
You are asking why this is important, so I will try to reiterate this:
- I know that identifiers are defined at the model-level, which is an abstract level. Abstract models need to be instantiated, and my argument is that this proposal seems impossible to instantiate on any real-world, serialized data (all data is serialized somehow in the real world). You claim that serializations should use different mechanisms such as XPath, are you implying that this is a proposal with no real-world (i.e., serialized) applicability?
This is utter nonsense, the fragment ID is just a string. That's it John, a string. You do whatever you like with it.
- This proposal defines IRI, which identify resources. Resources can be webpages or XML documents and usually are, but they can also be abstract concepts. For representing references to abstract concepts, the Resource Description Framework was invented. As an RDF expert, I have concerns about this proposal. In particular, addressing objects in a serialization-unspecific way usually requires methods like content negotiation to be implementable.
You see John, this is the problem. You're forcing in your world here, that we are not necessarily interested in. Making an IRI does not bring in RDF, nor does it bring in content negotiation. You have to live with the fact that others do not see things that way. An IRI is just a string. Nothing else.
To quote from https://www.ietf.org/rfc/rfc3987.txt:
"An IRI is a sequence of characters from the Universal Character Set (Unicode/ISO 10646)"
The standard also makes it absolutely clear that IRIs are not bound to a protocol with regard to this, on multiple places, e.g.
"Applications using IRIs as identity tokens with no relationship to a protocol MUST use the Simple String Comparison"
This is exactly our case, it's a string, it compares as a string, and it serves as identification of some DMLex entry part for us. We may call them "DMLex fragment identification strings" and not "IRIs", but given your attitude I doubt this would help here to move forward.
- I have implemented this proposal and it took nearly 800 lines of code. I had to change the proposal in a way you find unacceptable to make this work (in order to obtain valid relative URIs in RDF serialization). It is not simple and the implementation discovered several other bugs (
etymon
should be unique onetymology
#116, ShouldcollocateMarker
have a uniqueness constraints? #122, Example A1.11 fails uniqueness validation #123 and several documented on this PR). There is also a very simple alternative proposal (Solution 3).
Yes, all those are valid integrity checks that need to performed, thank you for that. We all know we need to do more of them, to find out all the forgotten small bugs in the spec here and there. None of that presents any substantial challenge.
In any case, this discussion leads nowhere. I find all the issues raised by John as void and none of the proposals by John are acceptable for me, particularly not the variant number 3, which is absolutely disastrous as discussed many times.
For the next meeting, I propose voting on this PR as is; and if it is not approved, we simply remove fragment identification from the specs completely and move on.
This satisfies Problem 1, as it is much more vague and does not mandate a URI schema so more use cases can be satisfied. Problem 2 is mostly side-stepped as this proposal now doesn't require anything of producers or consumers of data. I also think it is closer to what @mjakubicek has in mind, as he doesn't want a "request-response" mechanism based on serialization, while an HTTP URI requires that you can make an HTTP request and receive a serialized response.
For last: it does NOT. "an HTTP URI requires that you can make an HTTP request". There is no "HTTP URI". Just "URI", and an URI (or IRI, in our case), unlike an URL, does not mandate you need to be able to locate the resource. The name of the protocol does not affect this.
But if all the bugs you is the http:// scheme, we may just use urn: instead. It would perhaps fit more even from the theoretical perspective, though that's going to be a very subjective issue.
@mjakubicek, you continue to make highly uncivil comments on a public forum.
We may call them "DMLex fragment identification strings" and not "IRIs", but given your attitude I doubt this would help here to move forward.
I think this is exactly what I just proposed, right?
There is no "HTTP URI"
HTTP URI is an established term. It is pretty clear it means URIs that use the http
scheme.
But if all the bugs you is the http:// scheme, we may just use urn: instead. It would perhaps fit more even from the theoretical perspective, though that's going to be a very subjective issue.
I would support this, however I note that it requires a registration process with IANA as described in RFC 8141
We may call them "DMLex fragment identification strings" and not "IRIs", but given your attitude I doubt this would help here to move forward.
I think this is exactly what I just proposed, right?
So if we keep everything else as is, and replace all occurrences of "IRI" in the spec with "DMLex fragment identification string", you will vote for this?
There is no "HTTP URI"
HTTP URI is an established term. It is pretty clear it means URIs that use the
http
scheme.
Yes, but not requiring that you can make an HTTP request, which is what you were saying, and I was refuting. It's not about quibbling, but about facts John. Facts that you present here that are simply not true, and you continue doing so despite being falsified multiple times.
But if all the bugs you is the http:// scheme, we may just use urn: instead. It would perhaps fit more even from the theoretical perspective, though that's going to be a very subjective issue.
I would support this, however I note that it requires a registration process with IANA as described in RFC 8141
Only if we would want to make our own namespace which we do not need to, there are other options (e.g. the tag namespace, maybe others too.) which require no central registration.
We may call them "DMLex fragment identification strings" and not "IRIs", but given your attitude I doubt this would help here to move forward.
I think this is exactly what I just proposed, right?
So if we keep everything else as is, and replace all occurrences of "IRI" in the spec with "DMLex fragment identification string", you will vote for this?
I guess so, but I would prefer that they did not start with http
as this would be confusing
Yes, but not requiring that you can make an HTTP request, which is what you were saying, and I was refuting. It's not about quibbling, but about facts John. Facts that you present here that are simply not true, and you continue doing so despite being falsified multiple times.
"The term "Uniform Resource Locator" (URL) refers to the subset of URIs that, in addition to identifying a resource, provide a means of locating the resource by describing its primary access mechanism (e.g., its network "location")" [RFC 3986] "The HTTP URL scheme is used to designate Internet resources accessible using HTTP (HyperText Transfer Protocol)" [RFC 1738]
My facts are pretty clear.
We may call them "DMLex fragment identification strings" and not "IRIs", but given your attitude I doubt this would help here to move forward.
I think this is exactly what I just proposed, right?
So if we keep everything else as is, and replace all occurrences of "IRI" in the spec with "DMLex fragment identification string", you will vote for this?
I guess so, but I would prefer that they did not start with
http
as this would be confusing
Fine, I think noone really worries about the scheme being used here, which I see as a completely arbitrary choice. So, to avoid confusion, if this PR is changed so that all mentions of IRIs are replaced with "DMLex fragment identification string" and there is no "http://" prefix, you are happy with the rest and we can merge it and move on?
Yes, but not requiring that you can make an HTTP request, which is what you were saying, and I was refuting. It's not about quibbling, but about facts John. Facts that you present here that are simply not true, and you continue doing so despite being falsified multiple times.
"The term "Uniform Resource Locator" (URL) refers to the subset of URIs that, in addition to identifying a resource, provide a means of locating the resource by describing its primary access mechanism (e.g., its network "location")" [RFC 3986] "The HTTP URL scheme is used to designate Internet resources accessible using HTTP (HyperText Transfer Protocol)" [RFC 1738]
My facts are pretty clear.
Facts are clear in that you now for the first time talk about a URL (i.e. a Uniform Resource Locator, not URI which is Uniform Resource Identifier), which was never discussed and never considered and never mentioned before. What you were saying before was that "an HTTP URI requires that you can make an HTTP request" -- and this is simply not true, and thus all your seemingly necessary implications you were making thereof are not true as well.
We may call them "DMLex fragment identification strings" and not "IRIs", but given your attitude I doubt this would help here to move forward.
I think this is exactly what I just proposed, right?
So if we keep everything else as is, and replace all occurrences of "IRI" in the spec with "DMLex fragment identification string", you will vote for this?
I guess so, but I would prefer that they did not start with
http
as this would be confusingFine, I think noone really worries about the scheme being used here, which I see as a completely arbitrary choice. So, to avoid confusion, if this PR is changed so that all mentions of IRIs are replaced with "DMLex fragment identification string" and there is no "http://" prefix, you are happy with the rest and we can merge it and move on?
You have exactly arrived at the solution I proposed this morning. Why would I object?
Of course, it needs to be implemented and #123 needs a resolution before this PR can be merged.
I also would like us to consider the use of listingOrder
as an alternative mechanism, but I can make this a comment on the next CSD.
Yes, but not requiring that you can make an HTTP request, which is what you were saying, and I was refuting. It's not about quibbling, but about facts John. Facts that you present here that are simply not true, and you continue doing so despite being falsified multiple times.
"The term "Uniform Resource Locator" (URL) refers to the subset of URIs that, in addition to identifying a resource, provide a means of locating the resource by describing its primary access mechanism (e.g., its network "location")" [RFC 3986] "The HTTP URL scheme is used to designate Internet resources accessible using HTTP (HyperText Transfer Protocol)" [RFC 1738] My facts are pretty clear.
Facts are clear in that you now for the first time talk about a URL (i.e. a Uniform Resource Locator, not URI which is Uniform Resource Identifier), which was never discussed and never considered and never mentioned before. What you were saying before was that "an HTTP URI requires that you can make an HTTP request" -- and this is simply not true, and thus all your seemingly necessary implications you were making thereof are not true as well.
We have already discussed URLs in fact:
I do not think we ever discussed that we would want the IRIs to be usable as URLs so this is a far reaching implicit assumption that is false at this moment. - @mjakubicek
URIs starting with http are HTTP URLs. The examples you have given are HTTP URLs so the assumption is pretty clear. - @jmccrae
That URLs designate such resources means that you only refer to resources that meet these requirements. Being accessible by HTTP means you can access them by making an HTTP request. Hence "an HTTP URL requires that you can make an HTTP request".
Fine, I think noone really worries about the scheme being used here, which I see as a completely arbitrary choice. So, to avoid confusion, if this PR is changed so that all mentions of IRIs are replaced with "DMLex fragment identification string" and there is no "http://" prefix, you are happy with the rest and we can merge it and move on?
You have exactly arrived at the solution I proposed this morning. Why would I object?
Because this is not what your initial proposal was (this morning), as everyone can read up in the thread. I do not want the "#" to be part of "DMLex fragment identification strings", which is what your proposal starts with, and then continues on with other things, among others also mentioning this rename.
And that's why I'm double checking that we understand that the only change performed would be a wording issue solvable by a simple sed (i.e. find and replace command):
sed 's/IRI/DMLex fragment identification strings/g'
That's it.
We have already discussed URLs in fact:
I do not think we ever discussed that we would want the IRIs to be usable as URLs so this is a far reaching implicit assumption that is false at this moment. - @mjakubicek
Ok, you got me, we have already rule them out once ;-)
Fine, I think noone really worries about the scheme being used here, which I see as a completely arbitrary choice. So, to avoid confusion, if this PR is changed so that all mentions of IRIs are replaced with "DMLex fragment identification string" and there is no "http://" prefix, you are happy with the rest and we can merge it and move on?
You have exactly arrived at the solution I proposed this morning. Why would I object?
Because this is not what your initial proposal was (this morning), as everyone can read up in the thread. I do not want the "#" to be part of "DMLex fragment identification strings", which is what your proposal starts with, and then continues on with other things, among others also mentioning this rename.
And that's why I'm double checking that we understand that the only change performed would be a wording issue solvable by a simple sed (i.e. find and replace command):
sed 's/IRI/DMLex fragment identification strings/g'
That's it.
In principle that's right, although a quick look at the text shows that a little more care than a text replacement is needed!
The other part is removing the http://
prefix. I have a few suggestions here:
# Don't include lexicographicResource.uri at all (do we need it?)
entry/cat~1~noun
# Drop the http://
www.example.com/lexicon/entry/cat~1~noun
# Put the lexicographicResource.uri in brackets (one of the following)
[http://www.example.com/lexicon]entry/cat~1~noun
(http://www.example.com/lexicon)entry/cat~1~noun
<http://www.example.com/lexicon>entry/cat~1~noun
# Put the lexicographicResource.uri after the objectId
entry/cat~1~noun@http://www.example.com/lexicon
All seem good and avoid creating identifiers that are accidentally non-functioning URLs.
I don't feel like adding more disagreement to this discussion, and nobody else wrote anything, so I did what you propose (i.e., renamed IRIs to "DMLex fragment identification strings" and removed the http://
prefix).
Just FTR: Though acceptable, I don't agree with it -- I think one of the reasons why we said first URIs and then IRIs is that they can be used as HTTP(S) URLs which is an advantage, and we are now losing this option (kind of, as adding http://
is in fact not that complex operation). At the same time, I am not bothered by many IRIs that don't work as HTTP URLs, or lead nowhere (I think I still don't fully understand John's reasons, but never mind).
I have also addressed the problem with #123, using listingOrder
in cases where all the UNIQUE attributes are empty and there are more objects with duplicate IDs. (And the exact semantics of UNIQUEness still needs to be specified more precisely in the text somewhere around 1.3.5, I believe.)
Okay, sounds like a good fix.
My objection is I don't think that hard to understand: HTTP URLs that lead nowhere are called broken links and cause many problems not just to the user experience, but also affecting SEO for websites. Implementing only working HTTP URLs ensures the global uniqueness of these identifiers and prevents malicious attacks.
Is this related to #97?