You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Reframe §3.1.3 WebID Profile assembly as set-based fixed point
Replaces the prior linear procedure with a single set S of statements
grown by repeated discovery-link expansion. Defines "user's WebIDs" as
the original WebID plus the transitive owl:sameAs closure within S, and
restricts discovery-link traversal (rdfs:seeAlso, foaf:isPrimaryTopicOf,
pim:preferencesFile, owl:sameAs) to triples whose subject is a user's
WebID. Type-Index fetch and final subject filter use the same set.
§3.1.2 item 3 reduced to a single sentence pointing at §3.1.3; oidcIssuer
caveat dropped here as the algorithm's authoritative filter covers it.
WebID Profile dfn now defined in terms of the procedure.
Adds notes on cycle detection / advisory depth limits, Preferences-link
leniency, and entity reconciliation (augmentation vs rewriting).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
<dd>A document, linked from the agent's <ahref="#dfn-webid-profile">WebID Profile</a> via <code>pim:preferencesFile</code>, that holds settings and pointers to private data; typically accessible only to the agent or a delegate.</dd>
<dd>The RDF graph [<cite><aclass="bibref" href="#ref-rdf11-concepts">RDF11-CONCEPTS</a></cite>] formed by the set union of statements drawn from the <ahref="#dfn-webid-profile-document">WebID Profile Document</a>, any <ahref="#dfn-extended-profile-document">Extended Profile Documents</a>, the <ahref="#dfn-preferences-document">Preferences Document</a>, and the Type Index documents, assembled per the <ahref="#webid-non-normative">common assumptions below</a>.</dd>
490
+
<dd>The RDF graph [<cite><aclass="bibref" href="#ref-rdf11-concepts">RDF11-CONCEPTS</a></cite>] produced by the procedure in <ahref="#webid-algorithms">§ Assembling the Profile</a>.</dd>
@@ -536,10 +536,7 @@ <h4>Common assumptions not required by Solid26 Implementation Guide specificatio
536
536
The <code>pim:storage</code> statement in the WebID Profile is the only sound mechanism for discovering an agent's storages. The <code>storageDescription</code> Link header is not to be used for this purpose: a WebID Document hosted in a storage does not imply the WebID owns that storage [<cite><aclass="bibref" href="#ref-solid-protocol">Solid Protocol</a></cite> § <ahref="https://solidproject.org/TR/2024/protocol-20240512#webid-profile-privacy">Privacy Considerations</a>].
537
537
</li>
538
538
<li>
539
-
The WebID Profile is assembled by collecting all statements that have the WebID as subject or object, drawn from the WebID Document and from any Extended Profile Document linked from it via <code>rdfs:seeAlso</code>, <code>foaf:isPrimaryTopicOf</code>, or <code>owl:sameAs</code> (collectively, <dfnid="dfn-discovery-links">discovery links</dfn>) [<cite><aclass="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <ahref="https://solid.github.io/webid-profile/#discovery">Discovery</a>; <cite><aclass="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <ahref="https://solid.github.io/webid-profile/#extending-profile">Extending a Profile</a>; <cite><aclass="bibref" href="#ref-webid">WebID 1.0</a></cite> § <ahref="https://www.w3.org/2005/Incubator/webid/spec/identity/#processing-the-webid-profile">Processing the WebID Profile</a>]. Extended Profile Documents may require authenticated retrieval. One caveat applies:
540
-
<ul>
541
-
<li><code>solid:oidcIssuer</code> is honoured only from the WebID Document; statements of the form <code>?webid solid:oidcIssuer ?iss</code> in Extended Profile Documents are ignored.</li>
542
-
</ul>
539
+
The WebID Profile is the full set of valid statements collected by the discovery procedure in <ahref="#webid-algorithms">§ Assembling the Profile</a> [<cite><aclass="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <ahref="https://solid.github.io/webid-profile/#discovery">Discovery</a>; <cite><aclass="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <ahref="https://solid.github.io/webid-profile/#extending-profile">Extending a Profile</a>; <cite><aclass="bibref" href="#ref-webid">WebID 1.0</a></cite> § <ahref="https://www.w3.org/2005/Incubator/webid/spec/identity/#processing-the-webid-profile">Processing the WebID Profile</a>].
543
540
</li>
544
541
</ol>
545
542
</div>
@@ -549,26 +546,32 @@ <h4>Common assumptions not required by Solid26 Implementation Guide specificatio
<p>Per [<cite><aclass="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <ahref="https://solid.github.io/webid-profile/#discovery">Discovery</a>], the full profile is the union of statements in:</p>
<li><ahref="#dfn-extended-profile-document">Extended Profile Documents</a> directly linked from the WebID Document via <ahref="#dfn-discovery-links">discovery links</a>, and Extended Profile Documents that those in turn link by discovery links;</li>
556
-
<li>the agent's <ahref="#dfn-preferences-document">Preferences Document</a> (linked via <code>pim:preferencesFile</code>) and the Extended Profile Documents it links by discovery links;</li>
557
-
<li>the agent's public and private Type Index documents (linked via <code>solid:publicTypeIndex</code> and <code>solid:privateTypeIndex</code>).</li>
558
-
</ul>
559
-
560
-
<p>To assemble it:</p>
549
+
<p>The WebID Profile is the set <em>S</em> of statements assembled by the procedure below. The <em>user's WebIDs</em> are the original WebID together with every WebID transitively equated to it via <code>owl:sameAs</code> within <em>S</em>; this set grows as <em>S</em> grows. Apply cycle detection throughout: do not re-fetch a document already retrieved. On <code>401</code>/<code>403</code> with a logged-in user, retry authenticated; missing links are not errors.</p>
561
550
<ol>
562
-
<li><code>GET</code> the WebID Document. If it cannot be retrieved, surface a clear error.</li>
563
-
<li><code>GET</code>each linked document: Extended Profile Documents via <ahref="#dfn-discovery-links">discovery links</a>, the Preferences Document via <code>pim:preferencesFile</code>, and Type Index documents via <code>solid:publicTypeIndex</code>/<code>solid:privateTypeIndex</code>. On<code>401</code>/<code>403</code>with a logged-in user, retry authenticated; Preferences and the private Type Index normally require authentication [<cite><aclass="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <ahref="https://solid.github.io/webid-profile/#discovery">Discovery</a>, § <ahref="https://solid.github.io/webid-profile/#private-preferences">Private Preferences</a>]. If the WebID Document does not link a Preferences Document or Type Index documents, those fetches are skipped; their absence is not an error.</li>
564
-
<li>For each Extended Profile Document linked directly from the WebID Document, fetch the Extended Profile Documents it links via its <ahref="#dfn-discovery-links">discovery links</a>. Do not traverse further: discovery links in the documents fetched by this step, in extended profiles discovered from the Preferences Document, and in Type Index documents are not followed. Use cycle detection so no document is fetched twice.</li>
565
-
<li>Form the set union of statements from the fetched documents, then drop every <code>solid:oidcIssuer</code> triple that did not originate in the WebID Document: that predicate is authoritative only when sourced there, mirroring the write protection in <cite><aclass="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <ahref="https://solid.github.io/webid-profile/#updating-profile">Updating Profile</a>. Other discovery predicates (e.g., <code>pim:storage</code>, <code>ldp:inbox</code>) may legitimately appear in any of these documents.</li>
566
-
<li>Retain only statements that have the WebID as subject or object [<cite><aclass="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <ahref="https://solid.github.io/webid-profile/#discovery">Discovery</a>].</li>
551
+
<li><strong>Initialise.</strong><code>GET</code> the WebID Document for the original WebID. If it cannot be retrieved, surface a clear error. Add its triples to <em>S</em>.</li>
552
+
<li><strong>Discovery-link expansion.</strong> For each triple <code>?w ?p ?o</code> in <em>S</em> where <code>?p</code> is a <dfnid="dfn-discovery-links">discovery link</dfn> (<code>rdfs:seeAlso</code>, <code>foaf:isPrimaryTopicOf</code>, <code>pim:preferencesFile</code>, or<code>owl:sameAs</code>), <code>?w</code>is one of the user's WebIDs, and <code>?o</code> is a URL whose document has not yet been fetched, <code>GET</code><code>?o</code>and add its triples to <em>S</em>. Repeat until no new documents are discovered [<cite><aclass="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <ahref="https://solid.github.io/webid-profile/#discovery">Discovery</a>, § <ahref="https://solid.github.io/webid-profile/#private-preferences">Private Preferences</a>].</li>
553
+
<li><strong>Type Indexes.</strong>For each triple in <em>S</em> with predicate <code>solid:publicTypeIndex</code> or <code>solid:privateTypeIndex</code> whose subject is one of the user's WebIDs, <code>GET</code> the document at the object (if not already fetched) and add its triples to <em>S</em>.</li>
554
+
<li><strong>Authoritative filter.</strong> Drop every <code>solid:oidcIssuer</code> triple in <em>S</em>that did not originate in a WebID Document; that predicate is authoritative only when sourced there, mirroring the write protection in <cite><aclass="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <ahref="https://solid.github.io/webid-profile/#updating-profile">Updating Profile</a>. Other discovery predicates (e.g., <code>pim:storage</code>, <code>ldp:inbox</code>) may legitimately appear in any of the fetched documents.</li>
555
+
<li><strong>Subject filter.</strong> Restrict <em>S</em> to triples whose subject or object is one of the user's WebIDs [<cite><aclass="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <ahref="https://solid.github.io/webid-profile/#discovery">Discovery</a>]. The result is the WebID Profile graph.</li>
567
556
</ol>
568
557
569
558
<divclass="note">
570
559
<h4><span>Note</span></h4>
571
-
<p>When the WebID Document is not hosted in Solid storage, clients cannot add new <ahref="#dfn-discovery-links">discovery links</a> to it. The one level of traversal from Extended Profile Documents in Solid storage lets a client attach further Extended Profile Documents (for example, at different access levels) via links it can write.</p>
560
+
<p>Traversal of discovery links is unbounded; clients SHOULD apply cycle detection (no document fetched twice). Clients MAY also consider terminating traversal at a depth or document-count limit appropriate to their environment, to bound fetch cost and protect against pathological link chains.</p>
561
+
</div>
562
+
563
+
<divclass="note">
564
+
<h4><span>Note (Preferences leniency)</span></h4>
565
+
<p>Including <code>pim:preferencesFile</code> in the discovery-link set is intentionally lenient. In practice an agent has a single Preferences Document linked from the original WebID Document; the algorithm tolerates the <code>pim:preferencesFile</code> link appearing in any document already in <em>S</em>, provided its subject is one of the user's WebIDs.</p>
<p>The assembled graph may contain triples about more than one of the user's WebIDs. Depending on the client's context, these typically need to be reconciled into a single subject. Two common strategies:</p>
571
+
<ul>
572
+
<li><strong>Augmentation</strong> — for every triple in which one of the user's WebIDs appears as subject or object, add a parallel triple substituting the original WebID. Non-destructive; original sources are preserved.</li>
573
+
<li><strong>Rewriting</strong> — replace every occurrence of any of the user's WebIDs (subject or object) with the original WebID, then delete the <code>owl:sameAs</code> triples.</li>
0 commit comments