From 354112ddc255eb735e1fc32ffbfea8936a4ca18d Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 16:24:01 +0000 Subject: [PATCH 01/17] feat: support all-day dates and recurrence selectors Widen core and scheduling date ranges, add schema.org recurrence constraints and complete scheduling/vCard close matches. Regenerate served docs and bump changed ontology/profile metadata to 1.1.0. Co-Authored-By: GPT-6.1-Sol (Codex) --- QUESTIONS.md | 14 +++++ .../docs/core-context.jsonld | 10 +--- .../docs/core.shacl.ttl | 21 ++++++- packages/solid-federation-vocab/docs/core.ttl | 13 +++-- .../docs/sectors/contacts-alignments.ttl | 23 +++++--- .../docs/sectors/scheduling-alignments.ttl | 17 ++++-- .../docs/sectors/scheduling-context.jsonld | 20 ++----- .../docs/sectors/scheduling.shacl.ttl | 57 +++++++++++++++---- .../docs/sectors/scheduling.ttl | 21 ++++--- .../sectors/contacts/contacts-alignments.ttl | 23 +++++--- .../sectors/core/core.shacl.ttl | 21 ++++++- .../sectors/core/core.ttl | 13 +++-- .../scheduling/scheduling-alignments.ttl | 17 ++++-- .../sectors/scheduling/scheduling.shacl.ttl | 57 +++++++++++++++---- .../sectors/scheduling/scheduling.ttl | 21 ++++--- 15 files changed, 248 insertions(+), 100 deletions(-) create mode 100644 QUESTIONS.md diff --git a/QUESTIONS.md b/QUESTIONS.md new file mode 100644 index 000000000..a7eac779e --- /dev/null +++ b/QUESTIONS.md @@ -0,0 +1,14 @@ + + +# sst-2qh interpretation questions + +1. **Which vCard target should generic `contact:ContactPoint` match?** + DECISIONS V10 / VOC-01 asks for vCard close matches on every contact class, + but names no generic vCard channel class. Options: retain only its existing + schema.org match, or add annotation-only matches to the existing vCard channel + properties. Conservative choice implemented: reuse `vcard:hasEmail`, + `vcard:hasTelephone`, `vcard:hasAddress`, `vcard:hasURL`, and + `vcard:hasInstantMessage`, following the existing `OnlineHandle` precedent. + No new class or entailment is introduced. Existing subclass/equivalence bridges + are preserved; the missing explicit close matches are additive. This does not + block the lane; the dispatcher may narrow this generic match later. diff --git a/packages/solid-federation-vocab/docs/core-context.jsonld b/packages/solid-federation-vocab/docs/core-context.jsonld index 4d3242434..3f6a7005f 100644 --- a/packages/solid-federation-vocab/docs/core-context.jsonld +++ b/packages/solid-federation-vocab/docs/core-context.jsonld @@ -120,14 +120,8 @@ "@id": "core:unit", "@type": "@id" }, - "validFrom": { - "@id": "core:validFrom", - "@type": "xsd:dateTime" - }, - "validUntil": { - "@id": "core:validUntil", - "@type": "xsd:dateTime" - }, + "validFrom": "core:validFrom", + "validUntil": "core:validUntil", "value": "core:value" } } diff --git a/packages/solid-federation-vocab/docs/core.shacl.ttl b/packages/solid-federation-vocab/docs/core.shacl.ttl index abe43773f..6ac6583c5 100644 --- a/packages/solid-federation-vocab/docs/core.shacl.ttl +++ b/packages/solid-federation-vocab/docs/core.shacl.ttl @@ -1,3 +1,4 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix core: . @@ -31,7 +32,8 @@ a owl:Ontology ; dcterms:title "Solid Core Ontology — SHACL profile"@en ; - owl:versionInfo "1.0.1" ; + owl:versionInfo "1.1.0" ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "F4 node shapes for the instantiable gUFO-rebased Core classes. Open by default; MUST=Violation, SHOULD=Warning. v1.0.1: adds core:QuantityShape (numericValue MUST, unit SHOULD)."@en . # ----------------------------------------------------------------------------- @@ -237,3 +239,20 @@ core:CategoryShape a sh:NodeShape ; sh:message "A Category value SHOULD declare the scheme it is drawn from."@en ; sh:minCount 0 ; ] . + +# ----------------------------------------------------------------------------- +# VALIDITY — optional dates on any subject using the shared temporal spine. +# ----------------------------------------------------------------------------- +core:ValidityShape a sh:NodeShape ; + sh:targetSubjectsOf core:validFrom, core:validUntil ; + rdfs:label "Validity dates shape"@en ; + sh:property [ + sh:path core:validFrom ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; + sh:message "Validity starts must be dates (all-day) or dateTimes."@en ; + ] ; + sh:property [ + sh:path core:validUntil ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; + sh:message "Validity ends must be dates (all-day) or dateTimes."@en ; + ] . diff --git a/packages/solid-federation-vocab/docs/core.ttl b/packages/solid-federation-vocab/docs/core.ttl index 0a938c662..a6a06891d 100644 --- a/packages/solid-federation-vocab/docs/core.ttl +++ b/packages/solid-federation-vocab/docs/core.ttl @@ -1,3 +1,4 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix core: . @@ -50,8 +51,8 @@ rdfs:label "Solid Core Ontology"@en ; vann:preferredNamespacePrefix "core" ; vann:preferredNamespaceUri "https://w3id.org/jeswr/core#" ; - owl:versionInfo "1.0.1" ; - owl:versionIRI ; + owl:versionInfo "1.1.0" ; + owl:versionIRI ; owl:imports ; dcterms:description """The foundational ontology of the Solid data federation, re-based onto gUFO (the gentle OWL-2-DL implementation of @@ -62,7 +63,7 @@ classes), so this is a new MAJOR version. The single mandatory import is now gUFO + this thin profile. External vocabularies are reached via the companion alignments file, never re-derived."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §1.3. v1.0.1 ADDITIVE: adds core:Quantity (a foundational reified quantity value) + core:numericValue/core:unit; no existing term changed."@en . # ----------------------------------------------------------------------------- @@ -340,13 +341,15 @@ core:timestamp a owl:DatatypeProperty ; skos:definition "A simple instant when literal-level precision is enough (e.g. record creation)."@en . core:validFrom a owl:DatatypeProperty ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "valid from"@en ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; skos:definition "Start of an entity's validity or applicability period."@en . core:validUntil a owl:DatatypeProperty ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "valid until"@en ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; skos:definition "End of an entity's validity or applicability period."@en . core:atPlace a owl:ObjectProperty ; diff --git a/packages/solid-federation-vocab/docs/sectors/contacts-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/contacts-alignments.ttl index 1ae0d3351..d130819f2 100644 --- a/packages/solid-federation-vocab/docs/sectors/contacts-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/contacts-alignments.ttl @@ -1,3 +1,4 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix contact: . @@ -5,6 +6,7 @@ @prefix owl: . @prefix rdfs: . @prefix skos: . +@prefix xsd: . @prefix dcterms: . @prefix vcard: . @prefix schema: . @@ -36,11 +38,13 @@ a owl:Ontology ; dcterms:title "Solid Contacts Sector Ontology — vcard & schema.org alignments (gUFO re-base)"@en ; owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:versionInfo "1.1.0" ; + dcterms:modified "2026-10-25"^^xsd:date ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to vcard (the canonical contacts vocab) and schema.org. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . +dcterms:modified a owl:AnnotationProperty . # ----------------------------------------------------------------------------- # Cards / kinds — vcard:Kind is the carrier; schema:ContactPoint the web view. @@ -59,24 +63,27 @@ contact:OrganizationContact skos:closeMatch vcard:Organization , schema:Organization . # ----------------------------------------------------------------------------- -# Contact points — value-types. subClassOf where safe (our class is the narrower -# Solid view of the vcard value-type); closeMatch to schema.org properties. +# Contact points — explicit closeMatch to vCard alongside the existing bridges. +# vCard has no generic contact-point class; match its channel properties, just +# as OnlineHandle does below. vCard remains the application write model (V10). # ----------------------------------------------------------------------------- contact:ContactPoint - skos:closeMatch schema:ContactPoint . + skos:closeMatch schema:ContactPoint , vcard:hasEmail , vcard:hasTelephone , + vcard:hasAddress , vcard:hasURL , vcard:hasInstantMessage . contact:EmailAddress rdfs:subClassOf vcard:Email ; - skos:closeMatch schema:email . + skos:closeMatch vcard:Email , schema:email . contact:PhoneNumber rdfs:subClassOf vcard:Tel ; - skos:closeMatch schema:telephone . + skos:closeMatch vcard:Tel , schema:telephone . contact:PostalAddress rdfs:subClassOf vcard:Address ; - owl:equivalentClass schema:PostalAddress . + owl:equivalentClass schema:PostalAddress ; + skos:closeMatch vcard:Address . contact:OnlineHandle skos:closeMatch vcard:hasURL , vcard:hasInstantMessage . diff --git a/packages/solid-federation-vocab/docs/sectors/scheduling-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/scheduling-alignments.ttl index 447aac729..e1ed85ef6 100644 --- a/packages/solid-federation-vocab/docs/sectors/scheduling-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/scheduling-alignments.ttl @@ -1,3 +1,4 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix sched: . @@ -5,6 +6,7 @@ @prefix owl: . @prefix rdfs: . @prefix skos: . +@prefix xsd: . @prefix dcterms: . @prefix cal: . @prefix schema: . @@ -36,11 +38,13 @@ a owl:Ontology ; dcterms:title "Solid Scheduling — external alignments (gUFO re-base)"@en ; owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:versionInfo "1.1.0" ; + dcterms:modified "2026-10-25"^^xsd:date ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to iCalendar (RFC 5545 / W3C cal:), schema.org and W3C OWL-Time. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . +dcterms:modified a owl:AnnotationProperty . # --- Classes: Calendar entries ------------------------------------------------ sched:CalendarEvent skos:closeMatch cal:Vevent , schema:Event . @@ -88,11 +92,12 @@ sched:attendanceStatus skos:closeMatch schema:rsvpResponse . sched:respondedAt skos:closeMatch schema:dateModified . # --- Properties: recurrence -------------------------------------------------- -# iCalendar FREQ / INTERVAL / COUNT / UNTIL are sub-parts of the RRULE value in -# cal:, not first-class property IRIs; schema:repeatFrequency is the nearest -# first-class external term for the frequency. +# RRULE components have approximate matches in cal: and schema:Schedule. sched:recurrence skos:closeMatch cal:rrule , schema:eventSchedule . -sched:frequency skos:closeMatch schema:repeatFrequency . +sched:frequency skos:closeMatch schema:repeatFrequency , cal:freq . +sched:interval skos:closeMatch cal:interval . +sched:count skos:closeMatch schema:repeatCount , cal:count . +sched:until skos:closeMatch cal:until . # --- Properties: reminder ---------------------------------------------------- sched:triggerTime skos:closeMatch cal:trigger . diff --git a/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld b/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld index 3641e66a4..395182934 100644 --- a/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld @@ -44,14 +44,8 @@ "@id": "sched:description", "@type": "xsd:string" }, - "dueTime": { - "@id": "sched:dueTime", - "@type": "xsd:dateTime" - }, - "endTime": { - "@id": "sched:endTime", - "@type": "xsd:dateTime" - }, + "dueTime": "sched:dueTime", + "endTime": "sched:endTime", "eventLocation": { "@id": "sched:eventLocation", "@type": "@id" @@ -92,10 +86,7 @@ "@type": "xsd:dateTime" }, "sector": "sched:sector", - "startTime": { - "@id": "sched:startTime", - "@type": "xsd:dateTime" - }, + "startTime": "sched:startTime", "summary": { "@id": "sched:summary", "@type": "xsd:string" @@ -110,9 +101,6 @@ "@id": "sched:triggerTime", "@type": "xsd:dateTime" }, - "until": { - "@id": "sched:until", - "@type": "xsd:dateTime" - } + "until": "sched:until" } } diff --git a/packages/solid-federation-vocab/docs/sectors/scheduling.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/scheduling.shacl.ttl index 9ecae3803..e8015cf1e 100644 --- a/packages/solid-federation-vocab/docs/sectors/scheduling.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/scheduling.shacl.ttl @@ -1,7 +1,9 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix schsh: . @prefix sched: . +@prefix schema: . @prefix core: . @prefix sh: . @prefix owl: . @@ -19,22 +21,23 @@ # conformance => parent-conformance, the §3.4 ⊆ rule). # - sh:severity carries the RFC 2119 grade: Violation=MUST, Warning=SHOULD, # Info=MAY. A conformance RESULT is read against severity, not pass/fail. -# - IMMUTABLE version IRI (.../scheduling/profile/1.0.0); additive-only. +# - IMMUTABLE version IRI (.../scheduling/profile/1.1.0); additive-only. # -# v1.0.0 tracks the gUFO re-base of scheduling.ttl. +# v1.1.0 adds all-day dates and schema.org recurrence selectors. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Scheduling data-model profile (gUFO re-base)"@en ; dcterms:isVersionOf ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:versionInfo "1.1.0" ; + dcterms:modified "2026-10-25"^^xsd:date ; + owl:versionIRI ; prof:isProfileOf ; - prof:hasToken "scheduling-1.0.0" ; + prof:hasToken "scheduling-1.1.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for calendar/scheduling data, re-based onto the gUFO Core. Validates CalendarEvent, Task, Calendar, Attendance, RecurrenceRule and Reminder. "@en . @@ -59,7 +62,7 @@ schsh:CalendarEventShape # MUST: a start time sh:property [ sh:path sched:startTime ; - sh:datatype xsd:dateTime ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; sh:minCount 1 ; sh:maxCount 1 ; sh:severity sh:Violation ; @@ -69,7 +72,7 @@ schsh:CalendarEventShape # SHOULD: an end time (open-ended / all-day events may omit) sh:property [ sh:path sched:endTime ; - sh:datatype xsd:dateTime ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; sh:minCount 1 ; sh:maxCount 1 ; sh:severity sh:Warning ; @@ -129,7 +132,7 @@ schsh:TaskShape sh:property [ sh:path sched:dueTime ; - sh:datatype xsd:dateTime ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; sh:maxCount 1 ; sh:severity sh:Warning ; sh:message "A Task SHOULD have a due time."@en ; @@ -219,6 +222,40 @@ schsh:RecurrenceRuleShape sh:maxCount 1 ; sh:severity sh:Info ; sh:message "Interval, when present, must be a positive integer."@en ; + ] ; + + sh:property [ + sh:path sched:until ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; + sh:maxCount 1 ; + sh:message "Until, when present, must be a date (all-day) or dateTime."@en ; + ] ; + + sh:property [ + sh:path schema:byDay ; + sh:or ( [ sh:nodeKind sh:IRI ] [ sh:datatype xsd:string ] ) ; + sh:message "By-day values must be IRIs or strings."@en ; + ] ; + + sh:property [ + sh:path schema:byMonthDay ; + sh:datatype xsd:integer ; + sh:or ( [ sh:minInclusive 1 ; sh:maxInclusive 31 ] [ sh:in ( -1 ) ] ) ; + sh:message "By-month-day values must be integers from 1 to 31, or -1 (last day)."@en ; + ] ; + + sh:property [ + sh:path schema:byMonth ; + sh:datatype xsd:integer ; + sh:minInclusive 1 ; + sh:maxInclusive 12 ; + sh:message "By-month values must be integers from 1 to 12."@en ; + ] ; + + sh:property [ + sh:path schema:exceptDate ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; + sh:message "Exception dates must be dates (all-day) or dateTimes."@en ; ] . # ----------------------------------------------------------------------------- diff --git a/packages/solid-federation-vocab/docs/sectors/scheduling.ttl b/packages/solid-federation-vocab/docs/sectors/scheduling.ttl index 0282679ba..6ed126935 100644 --- a/packages/solid-federation-vocab/docs/sectors/scheduling.ttl +++ b/packages/solid-federation-vocab/docs/sectors/scheduling.ttl @@ -1,3 +1,4 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix sched: . @@ -43,7 +44,7 @@ # (2) every class roots in a Core class and carries its gUFO meta-type; # (3) constrains, never forks; (4) reuses iCalendar/schema.org/OWL-Time in the # companion scheduling-alignments.ttl; (5) ships scheduling.shacl.ttl; -# (6) carries owl:versionInfo "1.0.0" + a version IRI (gUFO re-base = new MAJOR); +# (6) carries owl:versionInfo "1.1.0" + a version IRI (gUFO re-base = new MAJOR); # (7) Core ∪ scheduling is DL-valid + reasoner-consistent (see verification). # Open-world by default; the SHACL profile carries the closed-world MUST/SHOULD. # ============================================================================= @@ -54,8 +55,8 @@ vann:preferredNamespacePrefix "sched" ; vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/scheduling#" ; owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:versionInfo "1.1.0" ; + owl:versionIRI ; dcterms:description """Calendars and scheduling (the Calendar app), re-based onto the gUFO Core. Roots CalendarEvent in core:Event, Task/ToDo in core:Activity, Calendar/RecurrenceRule/Reminder in core:InformationResource @@ -66,7 +67,7 @@ meaning, and the v0 string-role relationship is replaced by a relator), so a new MAJOR version. Aligns to iCalendar RFC 5545, schema:Event/Schedule and W3C OWL-Time in the companion alignments file."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2."@en . # ----------------------------------------------------------------------------- @@ -241,20 +242,23 @@ sched:description a owl:DatatypeProperty ; # --- Temporal: reuse Core validFrom/validUntil for clock start/end --- sched:startTime a owl:DatatypeProperty ; rdfs:subPropertyOf core:validFrom ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "start time"@en ; skos:definition "Clock start of an entry. Specialises core:validFrom; aligns to iCalendar DTSTART and schema:startDate. For full interval modelling use core:atTime → time:Interval (OWL-Time)."@en . sched:endTime a owl:DatatypeProperty ; rdfs:subPropertyOf core:validUntil ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "end time"@en ; skos:definition "Clock end of an entry. Specialises core:validUntil; aligns to iCalendar DTEND and schema:endDate."@en . sched:dueTime a owl:DatatypeProperty ; rdfs:subPropertyOf core:validUntil ; rdfs:domain sched:Task ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "due time"@en ; skos:definition "When a task is due. Specialises core:validUntil; aligns to iCalendar DUE."@en . @@ -341,7 +345,8 @@ sched:count a owl:DatatypeProperty ; sched:until a owl:DatatypeProperty ; rdfs:domain sched:RecurrenceRule ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "until"@en ; skos:definition "The last date/time at which the recurrence may produce an occurrence. Aligns to iCalendar UNTIL."@en . diff --git a/packages/solid-federation-vocab/sectors/contacts/contacts-alignments.ttl b/packages/solid-federation-vocab/sectors/contacts/contacts-alignments.ttl index 1ae0d3351..d130819f2 100644 --- a/packages/solid-federation-vocab/sectors/contacts/contacts-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/contacts/contacts-alignments.ttl @@ -1,3 +1,4 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix contact: . @@ -5,6 +6,7 @@ @prefix owl: . @prefix rdfs: . @prefix skos: . +@prefix xsd: . @prefix dcterms: . @prefix vcard: . @prefix schema: . @@ -36,11 +38,13 @@ a owl:Ontology ; dcterms:title "Solid Contacts Sector Ontology — vcard & schema.org alignments (gUFO re-base)"@en ; owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:versionInfo "1.1.0" ; + dcterms:modified "2026-10-25"^^xsd:date ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to vcard (the canonical contacts vocab) and schema.org. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . +dcterms:modified a owl:AnnotationProperty . # ----------------------------------------------------------------------------- # Cards / kinds — vcard:Kind is the carrier; schema:ContactPoint the web view. @@ -59,24 +63,27 @@ contact:OrganizationContact skos:closeMatch vcard:Organization , schema:Organization . # ----------------------------------------------------------------------------- -# Contact points — value-types. subClassOf where safe (our class is the narrower -# Solid view of the vcard value-type); closeMatch to schema.org properties. +# Contact points — explicit closeMatch to vCard alongside the existing bridges. +# vCard has no generic contact-point class; match its channel properties, just +# as OnlineHandle does below. vCard remains the application write model (V10). # ----------------------------------------------------------------------------- contact:ContactPoint - skos:closeMatch schema:ContactPoint . + skos:closeMatch schema:ContactPoint , vcard:hasEmail , vcard:hasTelephone , + vcard:hasAddress , vcard:hasURL , vcard:hasInstantMessage . contact:EmailAddress rdfs:subClassOf vcard:Email ; - skos:closeMatch schema:email . + skos:closeMatch vcard:Email , schema:email . contact:PhoneNumber rdfs:subClassOf vcard:Tel ; - skos:closeMatch schema:telephone . + skos:closeMatch vcard:Tel , schema:telephone . contact:PostalAddress rdfs:subClassOf vcard:Address ; - owl:equivalentClass schema:PostalAddress . + owl:equivalentClass schema:PostalAddress ; + skos:closeMatch vcard:Address . contact:OnlineHandle skos:closeMatch vcard:hasURL , vcard:hasInstantMessage . diff --git a/packages/solid-federation-vocab/sectors/core/core.shacl.ttl b/packages/solid-federation-vocab/sectors/core/core.shacl.ttl index abe43773f..6ac6583c5 100644 --- a/packages/solid-federation-vocab/sectors/core/core.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/core/core.shacl.ttl @@ -1,3 +1,4 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix core: . @@ -31,7 +32,8 @@ a owl:Ontology ; dcterms:title "Solid Core Ontology — SHACL profile"@en ; - owl:versionInfo "1.0.1" ; + owl:versionInfo "1.1.0" ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "F4 node shapes for the instantiable gUFO-rebased Core classes. Open by default; MUST=Violation, SHOULD=Warning. v1.0.1: adds core:QuantityShape (numericValue MUST, unit SHOULD)."@en . # ----------------------------------------------------------------------------- @@ -237,3 +239,20 @@ core:CategoryShape a sh:NodeShape ; sh:message "A Category value SHOULD declare the scheme it is drawn from."@en ; sh:minCount 0 ; ] . + +# ----------------------------------------------------------------------------- +# VALIDITY — optional dates on any subject using the shared temporal spine. +# ----------------------------------------------------------------------------- +core:ValidityShape a sh:NodeShape ; + sh:targetSubjectsOf core:validFrom, core:validUntil ; + rdfs:label "Validity dates shape"@en ; + sh:property [ + sh:path core:validFrom ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; + sh:message "Validity starts must be dates (all-day) or dateTimes."@en ; + ] ; + sh:property [ + sh:path core:validUntil ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; + sh:message "Validity ends must be dates (all-day) or dateTimes."@en ; + ] . diff --git a/packages/solid-federation-vocab/sectors/core/core.ttl b/packages/solid-federation-vocab/sectors/core/core.ttl index 0a938c662..a6a06891d 100644 --- a/packages/solid-federation-vocab/sectors/core/core.ttl +++ b/packages/solid-federation-vocab/sectors/core/core.ttl @@ -1,3 +1,4 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix core: . @@ -50,8 +51,8 @@ rdfs:label "Solid Core Ontology"@en ; vann:preferredNamespacePrefix "core" ; vann:preferredNamespaceUri "https://w3id.org/jeswr/core#" ; - owl:versionInfo "1.0.1" ; - owl:versionIRI ; + owl:versionInfo "1.1.0" ; + owl:versionIRI ; owl:imports ; dcterms:description """The foundational ontology of the Solid data federation, re-based onto gUFO (the gentle OWL-2-DL implementation of @@ -62,7 +63,7 @@ classes), so this is a new MAJOR version. The single mandatory import is now gUFO + this thin profile. External vocabularies are reached via the companion alignments file, never re-derived."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §1.3. v1.0.1 ADDITIVE: adds core:Quantity (a foundational reified quantity value) + core:numericValue/core:unit; no existing term changed."@en . # ----------------------------------------------------------------------------- @@ -340,13 +341,15 @@ core:timestamp a owl:DatatypeProperty ; skos:definition "A simple instant when literal-level precision is enough (e.g. record creation)."@en . core:validFrom a owl:DatatypeProperty ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "valid from"@en ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; skos:definition "Start of an entity's validity or applicability period."@en . core:validUntil a owl:DatatypeProperty ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "valid until"@en ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; skos:definition "End of an entity's validity or applicability period."@en . core:atPlace a owl:ObjectProperty ; diff --git a/packages/solid-federation-vocab/sectors/scheduling/scheduling-alignments.ttl b/packages/solid-federation-vocab/sectors/scheduling/scheduling-alignments.ttl index 447aac729..e1ed85ef6 100644 --- a/packages/solid-federation-vocab/sectors/scheduling/scheduling-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/scheduling/scheduling-alignments.ttl @@ -1,3 +1,4 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix sched: . @@ -5,6 +6,7 @@ @prefix owl: . @prefix rdfs: . @prefix skos: . +@prefix xsd: . @prefix dcterms: . @prefix cal: . @prefix schema: . @@ -36,11 +38,13 @@ a owl:Ontology ; dcterms:title "Solid Scheduling — external alignments (gUFO re-base)"@en ; owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:versionInfo "1.1.0" ; + dcterms:modified "2026-10-25"^^xsd:date ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to iCalendar (RFC 5545 / W3C cal:), schema.org and W3C OWL-Time. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . +dcterms:modified a owl:AnnotationProperty . # --- Classes: Calendar entries ------------------------------------------------ sched:CalendarEvent skos:closeMatch cal:Vevent , schema:Event . @@ -88,11 +92,12 @@ sched:attendanceStatus skos:closeMatch schema:rsvpResponse . sched:respondedAt skos:closeMatch schema:dateModified . # --- Properties: recurrence -------------------------------------------------- -# iCalendar FREQ / INTERVAL / COUNT / UNTIL are sub-parts of the RRULE value in -# cal:, not first-class property IRIs; schema:repeatFrequency is the nearest -# first-class external term for the frequency. +# RRULE components have approximate matches in cal: and schema:Schedule. sched:recurrence skos:closeMatch cal:rrule , schema:eventSchedule . -sched:frequency skos:closeMatch schema:repeatFrequency . +sched:frequency skos:closeMatch schema:repeatFrequency , cal:freq . +sched:interval skos:closeMatch cal:interval . +sched:count skos:closeMatch schema:repeatCount , cal:count . +sched:until skos:closeMatch cal:until . # --- Properties: reminder ---------------------------------------------------- sched:triggerTime skos:closeMatch cal:trigger . diff --git a/packages/solid-federation-vocab/sectors/scheduling/scheduling.shacl.ttl b/packages/solid-federation-vocab/sectors/scheduling/scheduling.shacl.ttl index 9ecae3803..e8015cf1e 100644 --- a/packages/solid-federation-vocab/sectors/scheduling/scheduling.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/scheduling/scheduling.shacl.ttl @@ -1,7 +1,9 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix schsh: . @prefix sched: . +@prefix schema: . @prefix core: . @prefix sh: . @prefix owl: . @@ -19,22 +21,23 @@ # conformance => parent-conformance, the §3.4 ⊆ rule). # - sh:severity carries the RFC 2119 grade: Violation=MUST, Warning=SHOULD, # Info=MAY. A conformance RESULT is read against severity, not pass/fail. -# - IMMUTABLE version IRI (.../scheduling/profile/1.0.0); additive-only. +# - IMMUTABLE version IRI (.../scheduling/profile/1.1.0); additive-only. # -# v1.0.0 tracks the gUFO re-base of scheduling.ttl. +# v1.1.0 adds all-day dates and schema.org recurrence selectors. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Scheduling data-model profile (gUFO re-base)"@en ; dcterms:isVersionOf ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:versionInfo "1.1.0" ; + dcterms:modified "2026-10-25"^^xsd:date ; + owl:versionIRI ; prof:isProfileOf ; - prof:hasToken "scheduling-1.0.0" ; + prof:hasToken "scheduling-1.1.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for calendar/scheduling data, re-based onto the gUFO Core. Validates CalendarEvent, Task, Calendar, Attendance, RecurrenceRule and Reminder. "@en . @@ -59,7 +62,7 @@ schsh:CalendarEventShape # MUST: a start time sh:property [ sh:path sched:startTime ; - sh:datatype xsd:dateTime ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; sh:minCount 1 ; sh:maxCount 1 ; sh:severity sh:Violation ; @@ -69,7 +72,7 @@ schsh:CalendarEventShape # SHOULD: an end time (open-ended / all-day events may omit) sh:property [ sh:path sched:endTime ; - sh:datatype xsd:dateTime ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; sh:minCount 1 ; sh:maxCount 1 ; sh:severity sh:Warning ; @@ -129,7 +132,7 @@ schsh:TaskShape sh:property [ sh:path sched:dueTime ; - sh:datatype xsd:dateTime ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; sh:maxCount 1 ; sh:severity sh:Warning ; sh:message "A Task SHOULD have a due time."@en ; @@ -219,6 +222,40 @@ schsh:RecurrenceRuleShape sh:maxCount 1 ; sh:severity sh:Info ; sh:message "Interval, when present, must be a positive integer."@en ; + ] ; + + sh:property [ + sh:path sched:until ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; + sh:maxCount 1 ; + sh:message "Until, when present, must be a date (all-day) or dateTime."@en ; + ] ; + + sh:property [ + sh:path schema:byDay ; + sh:or ( [ sh:nodeKind sh:IRI ] [ sh:datatype xsd:string ] ) ; + sh:message "By-day values must be IRIs or strings."@en ; + ] ; + + sh:property [ + sh:path schema:byMonthDay ; + sh:datatype xsd:integer ; + sh:or ( [ sh:minInclusive 1 ; sh:maxInclusive 31 ] [ sh:in ( -1 ) ] ) ; + sh:message "By-month-day values must be integers from 1 to 31, or -1 (last day)."@en ; + ] ; + + sh:property [ + sh:path schema:byMonth ; + sh:datatype xsd:integer ; + sh:minInclusive 1 ; + sh:maxInclusive 12 ; + sh:message "By-month values must be integers from 1 to 12."@en ; + ] ; + + sh:property [ + sh:path schema:exceptDate ; + sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ; + sh:message "Exception dates must be dates (all-day) or dateTimes."@en ; ] . # ----------------------------------------------------------------------------- diff --git a/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl b/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl index 0282679ba..6ed126935 100644 --- a/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl +++ b/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl @@ -1,3 +1,4 @@ +# AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # @prefix sched: . @@ -43,7 +44,7 @@ # (2) every class roots in a Core class and carries its gUFO meta-type; # (3) constrains, never forks; (4) reuses iCalendar/schema.org/OWL-Time in the # companion scheduling-alignments.ttl; (5) ships scheduling.shacl.ttl; -# (6) carries owl:versionInfo "1.0.0" + a version IRI (gUFO re-base = new MAJOR); +# (6) carries owl:versionInfo "1.1.0" + a version IRI (gUFO re-base = new MAJOR); # (7) Core ∪ scheduling is DL-valid + reasoner-consistent (see verification). # Open-world by default; the SHACL profile carries the closed-world MUST/SHOULD. # ============================================================================= @@ -54,8 +55,8 @@ vann:preferredNamespacePrefix "sched" ; vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/scheduling#" ; owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:versionInfo "1.1.0" ; + owl:versionIRI ; dcterms:description """Calendars and scheduling (the Calendar app), re-based onto the gUFO Core. Roots CalendarEvent in core:Event, Task/ToDo in core:Activity, Calendar/RecurrenceRule/Reminder in core:InformationResource @@ -66,7 +67,7 @@ meaning, and the v0 string-role relationship is replaced by a relator), so a new MAJOR version. Aligns to iCalendar RFC 5545, schema:Event/Schedule and W3C OWL-Time in the companion alignments file."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2."@en . # ----------------------------------------------------------------------------- @@ -241,20 +242,23 @@ sched:description a owl:DatatypeProperty ; # --- Temporal: reuse Core validFrom/validUntil for clock start/end --- sched:startTime a owl:DatatypeProperty ; rdfs:subPropertyOf core:validFrom ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "start time"@en ; skos:definition "Clock start of an entry. Specialises core:validFrom; aligns to iCalendar DTSTART and schema:startDate. For full interval modelling use core:atTime → time:Interval (OWL-Time)."@en . sched:endTime a owl:DatatypeProperty ; rdfs:subPropertyOf core:validUntil ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "end time"@en ; skos:definition "Clock end of an entry. Specialises core:validUntil; aligns to iCalendar DTEND and schema:endDate."@en . sched:dueTime a owl:DatatypeProperty ; rdfs:subPropertyOf core:validUntil ; rdfs:domain sched:Task ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "due time"@en ; skos:definition "When a task is due. Specialises core:validUntil; aligns to iCalendar DUE."@en . @@ -341,7 +345,8 @@ sched:count a owl:DatatypeProperty ; sched:until a owl:DatatypeProperty ; rdfs:domain sched:RecurrenceRule ; - rdfs:range xsd:dateTime ; + rdfs:range [ a rdfs:Datatype ; owl:unionOf ( xsd:date xsd:dateTime ) ] ; + skos:scopeNote "an xsd:date value means all-day"@en ; rdfs:label "until"@en ; skos:definition "The last date/time at which the recurrence may produce an occurrence. Aligns to iCalendar UNTIL."@en . From 936fa2f7582fbe9b5d6b71e6201be78121ee3a04 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 16:25:35 +0000 Subject: [PATCH 02/17] test: validate scheduling date and recurrence fixtures Run 22 positive and negative SHACL fixtures through validate.mjs, covering all-day tasks/events, Monday IRIs, selector boundaries and dateTime compatibility. Reuse the policy-cleared rdf-validate-shacl 0.6.5 already in the workspace lockfile. Co-Authored-By: GPT-6.1-Sol (Codex) --- packages/solid-federation-vocab/package.json | 3 +- .../scripts/validate.mjs | 36 ++++++++++++++++++- .../fixtures/scheduling/all-day-event.ttl | 15 ++++++++ .../test/fixtures/scheduling/all-day-task.ttl | 10 ++++++ .../scheduling/by-day-blank.invalid.ttl | 8 +++++ .../fixtures/scheduling/by-day.invalid.ttl | 8 +++++ .../fixtures/scheduling/byMonth-0.invalid.ttl | 8 +++++ .../fixtures/scheduling/byMonth-1.invalid.ttl | 8 +++++ .../fixtures/scheduling/byMonth-2.invalid.ttl | 8 +++++ .../scheduling/byMonthDay-0.invalid.ttl | 8 +++++ .../scheduling/byMonthDay-1.invalid.ttl | 8 +++++ .../scheduling/byMonthDay-2.invalid.ttl | 8 +++++ .../scheduling/byMonthDay-3.invalid.ttl | 8 +++++ .../scheduling/byMonthDay-4.invalid.ttl | 8 +++++ .../test/fixtures/scheduling/datetime.ttl | 21 +++++++++++ .../fixtures/scheduling/due-time.invalid.ttl | 10 ++++++ .../fixtures/scheduling/end-time.invalid.ttl | 13 +++++++ .../scheduling/except-date.invalid.ttl | 8 +++++ .../fixtures/scheduling/recurrence-monday.ttl | 10 ++++++ .../scheduling/recurrence-selectors.ttl | 14 ++++++++ .../scheduling/start-time.invalid.ttl | 13 +++++++ .../fixtures/scheduling/until.invalid.ttl | 8 +++++ .../scheduling/valid-from.invalid.ttl | 8 +++++ .../scheduling/valid-until.invalid.ttl | 8 +++++ pnpm-lock.yaml | 3 ++ 25 files changed, 258 insertions(+), 2 deletions(-) create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/all-day-event.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/all-day-task.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/by-day-blank.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/by-day.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-0.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-1.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-2.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-0.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-1.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-2.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-3.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-4.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/datetime.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/due-time.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/end-time.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/except-date.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-monday.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-selectors.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/start-time.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/until.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/valid-from.invalid.ttl create mode 100644 packages/solid-federation-vocab/test/fixtures/scheduling/valid-until.invalid.ttl diff --git a/packages/solid-federation-vocab/package.json b/packages/solid-federation-vocab/package.json index c6db7eef7..f28ac520b 100644 --- a/packages/solid-federation-vocab/package.json +++ b/packages/solid-federation-vocab/package.json @@ -24,6 +24,7 @@ "devDependencies": { "@rdfjs/wrapper": "^0.34.0", "jsonld": "^9.0.0", - "n3": "^1.17.4" + "n3": "^1.17.4", + "rdf-validate-shacl": "0.6.5" } } diff --git a/packages/solid-federation-vocab/scripts/validate.mjs b/packages/solid-federation-vocab/scripts/validate.mjs index f0ff9cdf5..8e3cf60a2 100644 --- a/packages/solid-federation-vocab/scripts/validate.mjs +++ b/packages/solid-federation-vocab/scripts/validate.mjs @@ -1,3 +1,4 @@ +// AUTHORED-BY Codex GPT-6.1-Sol // AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate // // Validate the vocabulary sources: @@ -14,7 +15,8 @@ import { readdirSync, readFileSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import jsonld from "jsonld"; -import { Parser } from "n3"; +import { Parser, Store } from "n3"; +import SHACLValidator from "rdf-validate-shacl"; const ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); @@ -166,6 +168,38 @@ for (const file of ctxFiles) { } } +// Exercise the actual profiles, including advisory constraints: a wrong datatype +// must produce a result even when the profile grades it Warning or Info. +console.log("\nSHACL: core validity and scheduling fixtures"); +const fixtureRoot = join(ROOT, "test", "fixtures", "scheduling"); +const shapes = new Store(); +for (const profile of ["core/core.shacl.ttl", "scheduling/scheduling.shacl.ttl"]) { + shapes.addQuads(new Parser().parse(readFileSync(join(ROOT, "sectors", profile), "utf8"))); +} +for (const file of readdirSync(fixtureRoot) + .filter((f) => f.endsWith(".ttl")) + .sort()) { + try { + const data = new Store(new Parser().parse(readFileSync(join(fixtureRoot, file), "utf8"))); + const report = await new SHACLValidator(shapes).validate(data); + const expectedValid = !file.endsWith(".invalid.ttl"); + if (report.conforms !== expectedValid || (expectedValid && report.results.length > 0)) { + fail( + `${file}: expected ${expectedValid ? "no results" : "a constraint failure"}, got ${report.results.length} result(s)`, + ); + for (const result of report.results) { + console.error( + ` ${result.focusNode.value}: ${result.path?.value ?? ""} ${result.message.map((m) => m.value).join("; ")}`, + ); + } + } else { + ok(`${file}: ${expectedValid ? "conforms without warnings" : "rejected as expected"}`); + } + } catch (err) { + fail(`${file}: SHACL validation failed: ${err.message}`); + } +} + console.log(""); if (failures > 0) { console.error(`VALIDATION FAILED — ${failures} problem(s).`); diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-event.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-event.ttl new file mode 100644 index 000000000..6f00ec599 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-event.ttl @@ -0,0 +1,15 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:event a sched:CalendarEvent ; + sched:summary "All-day event" ; + sched:startTime "2026-11-01"^^xsd:date ; + sched:endTime "2026-11-02"^^xsd:date ; + sched:organizer ex:organizer . +ex:organizer a core:Agent . +ex:period core:validFrom "2026-11-01"^^xsd:date ; + core:validUntil "2026-11-02"^^xsd:date . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-task.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-task.ttl new file mode 100644 index 000000000..016ec28a1 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-task.ttl @@ -0,0 +1,10 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:task a sched:Task ; + sched:summary "All-day task" ; + sched:dueTime "2026-11-01"^^xsd:date . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/by-day-blank.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/by-day-blank.invalid.ttl new file mode 100644 index 000000000..6fe006f29 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/by-day-blank.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "WEEKLY" ; schema:byDay [] . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/by-day.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/by-day.invalid.ttl new file mode 100644 index 000000000..c5ad0be21 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/by-day.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "WEEKLY" ; schema:byDay 1 . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-0.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-0.invalid.ttl new file mode 100644 index 000000000..fbfba062d --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-0.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "MONTHLY" ; schema:byMonth 0 . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-1.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-1.invalid.ttl new file mode 100644 index 000000000..2b824eafd --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-1.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "MONTHLY" ; schema:byMonth 13 . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-2.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-2.invalid.ttl new file mode 100644 index 000000000..151a41e7e --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-2.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "MONTHLY" ; schema:byMonth "1" . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-0.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-0.invalid.ttl new file mode 100644 index 000000000..a38159271 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-0.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "MONTHLY" ; schema:byMonthDay 0 . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-1.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-1.invalid.ttl new file mode 100644 index 000000000..d1e390088 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-1.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "MONTHLY" ; schema:byMonthDay -2 . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-2.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-2.invalid.ttl new file mode 100644 index 000000000..53bf7dc03 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-2.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "MONTHLY" ; schema:byMonthDay 32 . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-3.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-3.invalid.ttl new file mode 100644 index 000000000..6603e9230 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-3.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "MONTHLY" ; schema:byMonthDay "1" . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-4.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-4.invalid.ttl new file mode 100644 index 000000000..d5977f854 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-4.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "MONTHLY" ; schema:byMonthDay "1.5"^^xsd:decimal . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/datetime.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/datetime.ttl new file mode 100644 index 000000000..6c62fd07f --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/datetime.ttl @@ -0,0 +1,21 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:event a sched:CalendarEvent ; + sched:summary "Timed event" ; + sched:startTime "2026-11-01T09:00:00Z"^^xsd:dateTime ; + sched:endTime "2026-11-01T10:00:00Z"^^xsd:dateTime ; + sched:organizer ex:organizer . +ex:organizer a core:Agent . +ex:task a sched:Task ; + sched:summary "Timed task" ; + sched:dueTime "2026-11-01T09:00:00Z"^^xsd:dateTime . +ex:rule a sched:RecurrenceRule ; + sched:frequency "DAILY" ; + sched:until "2027-01-01T09:00:00Z"^^xsd:dateTime . +ex:period core:validFrom "2026-11-01T09:00:00Z"^^xsd:dateTime ; + core:validUntil "2026-11-02T09:00:00Z"^^xsd:dateTime . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/due-time.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/due-time.invalid.ttl new file mode 100644 index 000000000..c082603f3 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/due-time.invalid.ttl @@ -0,0 +1,10 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:task a sched:Task ; + sched:summary "Wrong due datatype" ; + sched:dueTime "2026-11-01" . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/end-time.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/end-time.invalid.ttl new file mode 100644 index 000000000..570c3c881 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/end-time.invalid.ttl @@ -0,0 +1,13 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:event a sched:CalendarEvent ; + sched:summary "Wrong end datatype" ; + sched:startTime "2026-11-01"^^xsd:date ; + sched:endTime "2026-11-02" ; + sched:organizer ex:organizer . +ex:organizer a core:Agent . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/except-date.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/except-date.invalid.ttl new file mode 100644 index 000000000..b4ccb2622 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/except-date.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "DAILY" ; schema:exceptDate "2026-11-01" . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-monday.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-monday.ttl new file mode 100644 index 000000000..ea3c68ecc --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-monday.ttl @@ -0,0 +1,10 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; + sched:frequency "WEEKLY" ; + schema:byDay schema:Monday . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-selectors.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-selectors.ttl new file mode 100644 index 000000000..b75f45edc --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-selectors.ttl @@ -0,0 +1,14 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; + sched:frequency "MONTHLY" ; + sched:until "2027-01-01"^^xsd:date ; + schema:byDay schema:Monday, "-1FR" ; + schema:byMonthDay 1, 31, -1 ; + schema:byMonth 1, 12 ; + schema:exceptDate "2026-11-01"^^xsd:date, "2026-12-01T09:00:00Z"^^xsd:dateTime . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/start-time.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/start-time.invalid.ttl new file mode 100644 index 000000000..aed9d24ad --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/start-time.invalid.ttl @@ -0,0 +1,13 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:event a sched:CalendarEvent ; + sched:summary "Wrong start datatype" ; + sched:startTime "2026-11-01" ; + sched:endTime "2026-11-02"^^xsd:date ; + sched:organizer ex:organizer . +ex:organizer a core:Agent . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/until.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/until.invalid.ttl new file mode 100644 index 000000000..a06371e2e --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/until.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:rule a sched:RecurrenceRule ; sched:frequency "DAILY" ; sched:until "2027-01-01" . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/valid-from.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/valid-from.invalid.ttl new file mode 100644 index 000000000..2b699900d --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/valid-from.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:period core:validFrom "2026-11-01" . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/valid-until.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/valid-until.invalid.ttl new file mode 100644 index 000000000..0f6566501 --- /dev/null +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/valid-until.invalid.ttl @@ -0,0 +1,8 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +@prefix ex: . +@prefix sched: . +@prefix core: . +@prefix schema: . +@prefix xsd: . + +ex:period core:validUntil "2026-11-01" . diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9ebf77ea..3773cb4f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3192,6 +3192,9 @@ importers: n3: specifier: ^1.17.4 version: 1.26.0 + rdf-validate-shacl: + specifier: 0.6.5 + version: 0.6.5 packages/solid-granary: dependencies: From f40d9fc43ddd503e3ea45fc0aebd2f4d366e0301 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 16:28:07 +0000 Subject: [PATCH 03/17] feat: add suite design tokens and fonts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Transcribe DS-01 sections 2.1–2.7 into typed tokens, CSS theme aliases and density sets. Freeze the spec inventory in a Vitest file snapshot and verify CSS parity. Co-Authored-By: GPT-6.1-Sol (Codex) --- packages/suite-ui/LICENSE | 21 + packages/suite-ui/README.md | 15 + packages/suite-ui/package.json | 46 + packages/suite-ui/scripts/copy-css.mjs | 6 + packages/suite-ui/src/fonts.ts | 24 + packages/suite-ui/src/index.ts | 4 + packages/suite-ui/src/styles/density.css | 29 + packages/suite-ui/src/styles/theme.css | 143 +++ packages/suite-ui/src/styles/tokens.css | 225 +++++ packages/suite-ui/src/tokens.ts | 1123 ++++++++++++++++++++++ packages/suite-ui/test/spec-tokens.json | 1102 +++++++++++++++++++++ packages/suite-ui/test/tokens.test.ts | 53 + packages/suite-ui/tsconfig.build.json | 17 + packages/suite-ui/tsconfig.json | 24 + packages/suite-ui/vitest.config.ts | 3 + scripts/token-css.mjs | 21 + 16 files changed, 2856 insertions(+) create mode 100644 packages/suite-ui/LICENSE create mode 100644 packages/suite-ui/README.md create mode 100644 packages/suite-ui/package.json create mode 100644 packages/suite-ui/scripts/copy-css.mjs create mode 100644 packages/suite-ui/src/fonts.ts create mode 100644 packages/suite-ui/src/index.ts create mode 100644 packages/suite-ui/src/styles/density.css create mode 100644 packages/suite-ui/src/styles/theme.css create mode 100644 packages/suite-ui/src/styles/tokens.css create mode 100644 packages/suite-ui/src/tokens.ts create mode 100644 packages/suite-ui/test/spec-tokens.json create mode 100644 packages/suite-ui/test/tokens.test.ts create mode 100644 packages/suite-ui/tsconfig.build.json create mode 100644 packages/suite-ui/tsconfig.json create mode 100644 packages/suite-ui/vitest.config.ts create mode 100644 scripts/token-css.mjs diff --git a/packages/suite-ui/LICENSE b/packages/suite-ui/LICENSE new file mode 100644 index 000000000..2f396fc37 --- /dev/null +++ b/packages/suite-ui/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Jesse Wright + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/suite-ui/README.md b/packages/suite-ui/README.md new file mode 100644 index 000000000..b3ec89f0a --- /dev/null +++ b/packages/suite-ui/README.md @@ -0,0 +1,15 @@ + +# @jeswr/suite-ui + +Normative tokens from `01-design-system` §2.1–2.7. Import `styles/tokens.css`, +`styles/theme.css` (Tailwind v4), and `styles/density.css`. Set `.dark` for dark +mode and `data-density="comfortable|compact"` for density. Coarse pointers force +comfortable rows and 44px controls. Reduced motion zeros motion durations. + +`tokens` exports the typed inventory, including both themes and compact values. +`fonts` exports `onest`, `sourceSerif`, and `sourceCode` for Next.js root layouts; +apply their `.variable` classes to the body. The default entry has no Next.js runtime import. + +The frozen `test/spec-tokens.json` is the spec transcription; the snapshot and CSS +parity test guard changes. Run `pnpm check:tokens` and `pnpm check:contrast` at the +workspace root. Known spec contrast issues are enumerated in `QUESTIONS.md`. diff --git a/packages/suite-ui/package.json b/packages/suite-ui/package.json new file mode 100644 index 000000000..fb33009fb --- /dev/null +++ b/packages/suite-ui/package.json @@ -0,0 +1,46 @@ +{ + "name": "@jeswr/suite-ui", + "version": "0.1.0", + "description": "Solid Suite normative design tokens, theme mapping, density and Next.js fonts", + "type": "module", + "license": "MIT", + "securityCritical": false, + "sideEffects": [ + "**/*.css" + ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./fonts": { + "types": "./dist/fonts.d.ts", + "import": "./dist/fonts.js" + }, + "./styles/tokens.css": "./dist/styles/tokens.css", + "./styles/theme.css": "./dist/styles/theme.css", + "./styles/density.css": "./dist/styles/density.css" + }, + "files": [ + "dist", + "src", + "README.md", + "LICENSE" + ], + "scripts": { + "build": "tsc -p tsconfig.build.json && node scripts/copy-css.mjs", + "lint": "biome check src test scripts vitest.config.ts", + "typecheck": "tsc --noEmit", + "test": "vitest run" + }, + "peerDependencies": { + "next": "^16.2.7" + }, + "devDependencies": { + "next": "16.2.7", + "@types/node": "^25.9.2", + "typescript": "^6.0.3", + "vitest": "^4.1.9", + "@biomejs/biome": "^2.5.1" + } +} diff --git a/packages/suite-ui/scripts/copy-css.mjs b/packages/suite-ui/scripts/copy-css.mjs new file mode 100644 index 000000000..63a1ebd3b --- /dev/null +++ b/packages/suite-ui/scripts/copy-css.mjs @@ -0,0 +1,6 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { cpSync, mkdirSync } from "node:fs"; + +const destination = new URL("../dist/styles/", import.meta.url); +mkdirSync(destination, { recursive: true }); +cpSync(new URL("../src/styles/", import.meta.url), destination, { recursive: true }); diff --git a/packages/suite-ui/src/fonts.ts b/packages/suite-ui/src/fonts.ts new file mode 100644 index 000000000..1f5427f51 --- /dev/null +++ b/packages/suite-ui/src/fonts.ts @@ -0,0 +1,24 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { Onest, Source_Code_Pro, Source_Serif_4 } from "next/font/google"; + +export const onest = Onest({ + subsets: ["latin", "latin-ext"], + display: "swap", + weight: "variable", + variable: "--font-onest", + fallback: ["system-ui", "-apple-system", "Segoe UI", "Roboto", "sans-serif"], +}); +export const sourceSerif = Source_Serif_4({ + subsets: ["latin", "latin-ext"], + display: "swap", + axes: ["opsz"], + variable: "--font-source-serif", + fallback: ["Georgia", "serif"], +}); +export const sourceCode = Source_Code_Pro({ + subsets: ["latin", "latin-ext"], + display: "swap", + weight: ["400", "600"], + variable: "--font-source-code", + fallback: ["ui-monospace", "SFMono-Regular", "Menlo", "monospace"], +}); diff --git a/packages/suite-ui/src/index.ts b/packages/suite-ui/src/index.ts new file mode 100644 index 000000000..515c47600 --- /dev/null +++ b/packages/suite-ui/src/index.ts @@ -0,0 +1,4 @@ +// AUTHORED-BY Codex GPT-6.1-Sol + +export type { SuiteToken, TokenName } from "./tokens.js"; +export { tokens } from "./tokens.js"; diff --git a/packages/suite-ui/src/styles/density.css b/packages/suite-ui/src/styles/density.css new file mode 100644 index 000000000..b6094cb24 --- /dev/null +++ b/packages/suite-ui/src/styles/density.css @@ -0,0 +1,29 @@ +/* AUTHORED-BY Codex GPT-6.1-Sol */ +:root, +[data-density="comfortable"] { + --row-h: 44px; + --row-h-grid-card: 200px; + --control-h: 36px; + --control-h-sm: 28px; + --cell-px: 12px; + --text-row: var(--text-base); +} +[data-density="compact"] { + --row-h: 32px; + --row-h-grid-card: 160px; + --control-h: 32px; + --control-h-sm: 24px; + --cell-px: 8px; + --text-row: var(--text-sm); +} +@media (pointer: coarse) { + :root, + [data-density] { + --row-h: 44px; + --row-h-grid-card: 200px; + --control-h: 44px; + --control-h-sm: 44px; + --cell-px: 12px; + --text-row: var(--text-base); + } +} diff --git a/packages/suite-ui/src/styles/theme.css b/packages/suite-ui/src/styles/theme.css new file mode 100644 index 000000000..78dd6fd64 --- /dev/null +++ b/packages/suite-ui/src/styles/theme.css @@ -0,0 +1,143 @@ +/* AUTHORED-BY Codex GPT-6.1-Sol */ +@custom-variant dark (&:is(.dark *)); + +:root { + --card: var(--surface); + --card-foreground: var(--foreground); + --popover: var(--surface); + --popover-foreground: var(--foreground); + --muted: var(--surface-2); + --muted-foreground: var(--foreground-muted); + --accent: var(--primary-soft); + --accent-foreground: var(--primary-soft-foreground); + --input: var(--border-strong); + --secondary: var(--surface-2); + --secondary-foreground: var(--foreground); +} + +@theme inline { + --color-background: var(--background); + --color-surface: var(--surface); + --color-surface-2: var(--surface-2); + --color-surface-3: var(--surface-3); + --color-rail: var(--rail); + --color-rail-foreground: var(--rail-foreground); + --color-foreground: var(--foreground); + --color-foreground-muted: var(--foreground-muted); + --color-foreground-subtle: var(--foreground-subtle); + --color-border: var(--border); + --color-border-strong: var(--border-strong); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-primary-soft: var(--primary-soft); + --color-primary-soft-foreground: var(--primary-soft-foreground); + --color-ring: var(--ring); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-destructive-soft: var(--destructive-soft); + --color-success: var(--success); + --color-warning: var(--warning); + --color-warning-foreground: var(--warning-foreground); + --color-info: var(--info); + --color-overlay: var(--overlay); + --color-app-home: var(--app-home); + --color-app-home-soft: var(--app-home-soft); + --color-presence-home: var(--presence-home); + --color-app-drive: var(--app-drive); + --color-app-drive-soft: var(--app-drive-soft); + --color-presence-drive: var(--presence-drive); + --color-app-docs: var(--app-docs); + --color-app-docs-soft: var(--app-docs-soft); + --color-presence-docs: var(--presence-docs); + --color-app-tasks: var(--app-tasks); + --color-app-tasks-soft: var(--app-tasks-soft); + --color-presence-tasks: var(--presence-tasks); + --color-app-calendar: var(--app-calendar); + --color-app-calendar-soft: var(--app-calendar-soft); + --color-presence-calendar: var(--presence-calendar); + --color-app-contacts: var(--app-contacts); + --color-app-contacts-soft: var(--app-contacts-soft); + --color-presence-contacts: var(--presence-contacts); + --color-app-notes: var(--app-notes); + --color-app-notes-soft: var(--app-notes-soft); + --color-presence-notes: var(--presence-notes); + --color-app-photos: var(--app-photos); + --color-app-photos-soft: var(--app-photos-soft); + --color-presence-photos: var(--presence-photos); + --color-app-chat: var(--app-chat); + --color-app-chat-soft: var(--app-chat-soft); + --color-presence-chat: var(--presence-chat); + --color-app-sheets: var(--app-sheets); + --color-app-sheets-soft: var(--app-sheets-soft); + --color-presence-sheets: var(--presence-sheets); + --color-app-mail: var(--app-mail); + --color-app-mail-soft: var(--app-mail-soft); + --color-presence-mail: var(--presence-mail); + --color-app-music: var(--app-music); + --color-app-music-soft: var(--app-music-soft); + --color-presence-music: var(--presence-music); + --color-app-money: var(--app-money); + --color-app-money-soft: var(--app-money-soft); + --color-presence-money: var(--presence-money); + --color-app-health: var(--app-health); + --color-app-health-soft: var(--app-health-soft); + --color-presence-health: var(--presence-health); + --color-app-permissions: var(--app-permissions); + --color-app-permissions-soft: var(--app-permissions-soft); + --color-presence-permissions: var(--presence-permissions); + --color-glyph: var(--glyph); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-input: var(--input); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --text-xs: var(--text-xs); + --text-xs--line-height: var(--lh-xs); + --text-xs--font-weight: var(--weight-xs); + --text-xs--letter-spacing: var(--tracking-xs); + --text-sm: var(--text-sm); + --text-sm--line-height: var(--lh-sm); + --text-sm--font-weight: var(--weight-sm); + --text-sm--letter-spacing: var(--tracking-sm); + --text-base: var(--text-base); + --text-base--line-height: var(--lh-base); + --text-base--font-weight: var(--weight-base); + --text-base--letter-spacing: var(--tracking-base); + --text-md: var(--text-md); + --text-md--line-height: var(--lh-md); + --text-md--font-weight: var(--weight-md); + --text-md--letter-spacing: var(--tracking-md); + --text-lg: var(--text-lg); + --text-lg--line-height: var(--lh-lg); + --text-lg--font-weight: var(--weight-lg); + --text-lg--letter-spacing: var(--tracking-lg); + --text-xl: var(--text-xl); + --text-xl--line-height: var(--lh-xl); + --text-xl--font-weight: var(--weight-xl); + --text-xl--letter-spacing: var(--tracking-xl); + --text-2xl: var(--text-2xl); + --text-2xl--line-height: var(--lh-2xl); + --text-2xl--font-weight: var(--weight-2xl); + --text-2xl--letter-spacing: var(--tracking-2xl); + --text-3xl: var(--text-3xl); + --text-3xl--line-height: var(--lh-3xl); + --text-3xl--font-weight: var(--weight-3xl); + --text-3xl--letter-spacing: var(--tracking-3xl); + --radius-sm: var(--radius-sm); + --radius-md: var(--radius-md); + --radius-lg: var(--radius-lg); + --radius-xl: var(--radius-xl); + --radius-full: var(--radius-full); + --font-sans: var(--font-ui); + --font-serif: var(--font-serif); + --font-mono: var(--font-mono); + --shadow-1: var(--shadow-1); + --shadow-2: var(--shadow-2); + --shadow-3: var(--shadow-3); +} diff --git a/packages/suite-ui/src/styles/tokens.css b/packages/suite-ui/src/styles/tokens.css new file mode 100644 index 000000000..e8eec33d9 --- /dev/null +++ b/packages/suite-ui/src/styles/tokens.css @@ -0,0 +1,225 @@ +/* AUTHORED-BY Codex GPT-6.1-Sol */ +/* Normative values: 01-design-system §2.1–2.7. */ +:root { + --background: oklch(0.985 0.004 85); + --surface: oklch(1 0 0); + --surface-2: oklch(0.965 0.006 85); + --surface-3: oklch(0.94 0.008 85); + --rail: oklch(0.22 0.02 240); + --rail-foreground: oklch(0.92 0.01 240); + --foreground: oklch(0.2 0.02 240); + --foreground-muted: oklch(0.47 0.018 240); + --foreground-subtle: oklch(0.6 0.015 240); + --border: oklch(0.9 0.008 85); + --border-strong: oklch(0.8 0.012 240); + --primary: oklch(0.46 0.085 205); + --primary-foreground: oklch(0.99 0.004 200); + --primary-soft: oklch(0.94 0.03 200); + --primary-soft-foreground: oklch(0.3 0.06 210); + --ring: oklch(0.6 0.12 205); + --destructive: oklch(0.52 0.19 27); + --destructive-foreground: oklch(0.99 0 0); + --destructive-soft: oklch(0.95 0.03 25); + --success: oklch(0.52 0.12 155); + --warning: oklch(0.62 0.14 75); + --warning-foreground: oklch(0.25 0.05 70); + --info: oklch(0.52 0.11 250); + --overlay: oklch(0.2 0.02 240 / 45%); + --app-home: oklch(0.5 0.11 205); + --app-home-soft: oklch(0.94 0.03 205); + --presence-home: oklch(0.6 0.14 205); + --app-drive: oklch(0.5 0.11 250); + --app-drive-soft: oklch(0.94 0.03 250); + --presence-drive: oklch(0.6 0.14 250); + --app-docs: oklch(0.5 0.11 280); + --app-docs-soft: oklch(0.94 0.03 280); + --presence-docs: oklch(0.6 0.14 280); + --app-tasks: oklch(0.5 0.11 150); + --app-tasks-soft: oklch(0.94 0.03 150); + --presence-tasks: oklch(0.6 0.14 150); + --app-calendar: oklch(0.5 0.11 40); + --app-calendar-soft: oklch(0.94 0.03 40); + --presence-calendar: oklch(0.6 0.14 40); + --app-contacts: oklch(0.5 0.11 320); + --app-contacts-soft: oklch(0.94 0.03 320); + --presence-contacts: oklch(0.6 0.14 320); + --app-notes: oklch(0.5 0.11 85); + --app-notes-soft: oklch(0.94 0.03 85); + --presence-notes: oklch(0.6 0.14 85); + --app-photos: oklch(0.5 0.11 350); + --app-photos-soft: oklch(0.94 0.03 350); + --presence-photos: oklch(0.6 0.14 350); + --app-chat: oklch(0.5 0.11 300); + --app-chat-soft: oklch(0.94 0.03 300); + --presence-chat: oklch(0.6 0.14 300); + --app-sheets: oklch(0.5 0.11 170); + --app-sheets-soft: oklch(0.94 0.03 170); + --presence-sheets: oklch(0.6 0.14 170); + --app-mail: oklch(0.5 0.11 20); + --app-mail-soft: oklch(0.94 0.03 20); + --presence-mail: oklch(0.6 0.14 20); + --app-music: oklch(0.5 0.11 335); + --app-music-soft: oklch(0.94 0.03 335); + --presence-music: oklch(0.6 0.14 335); + --app-money: oklch(0.5 0.11 130); + --app-money-soft: oklch(0.94 0.03 130); + --presence-money: oklch(0.6 0.14 130); + --app-health: oklch(0.5 0.11 10); + --app-health-soft: oklch(0.94 0.03 10); + --presence-health: oklch(0.6 0.14 10); + --app-permissions: oklch(0.5 0.11 225); + --app-permissions-soft: oklch(0.94 0.03 225); + --presence-permissions: oklch(0.6 0.14 225); + --glyph: oklch(1 0 0); + --text-xs: 0.75rem; + --lh-xs: 1rem; + --weight-xs: 500; + --tracking-xs: 0.01em; + --text-sm: 0.8125rem; + --lh-sm: 1.25rem; + --weight-sm: 400; + --tracking-sm: 0; + --text-base: 0.875rem; + --lh-base: 1.375rem; + --weight-base: 400; + --tracking-base: 0; + --text-md: 1rem; + --lh-md: 1.5rem; + --weight-md: 400; + --tracking-md: 0; + --text-lg: 1.125rem; + --lh-lg: 1.625rem; + --weight-lg: 600; + --tracking-lg: -0.005em; + --text-xl: 1.375rem; + --lh-xl: 1.75rem; + --weight-xl: 600; + --tracking-xl: -0.01em; + --text-2xl: 1.75rem; + --lh-2xl: 2.125rem; + --weight-2xl: 600; + --tracking-2xl: -0.015em; + --text-3xl: 2.25rem; + --lh-3xl: 2.625rem; + --weight-3xl: 600; + --tracking-3xl: -0.02em; + --space-0\.5: 2px; + --space-1: 4px; + --space-1\.5: 6px; + --space-2: 8px; + --space-3: 12px; + --space-4: 16px; + --space-5: 20px; + --space-6: 24px; + --space-8: 32px; + --space-10: 40px; + --space-12: 48px; + --space-16: 64px; + --rail-w: 56px; + --sidebar-w: 264px; + --topbar-h: 56px; + --topbar-h-mobile: 48px; + --page-docs-w: 816px; + --page-settings-w: 720px; + --page-permissions-w: 880px; + --dialog-sm: 420px; + --dialog-md: 560px; + --dialog-lg: 720px; + --dialog-xl: 960px; + --radius-sm: 4px; + --radius-md: 6px; + --radius-lg: 10px; + --radius-xl: 16px; + --radius-full: 9999px; + --radius: 6px; + --elevation-0-border: 1px solid var(--border); + --shadow-1: 0 1px 2px oklch(0 0 0 / 6%), 0 0 0 1px var(--border); + --elevation-1-fill: var(--surface); + --shadow-2: 0 4px 12px oklch(0 0 0 / 10%), 0 0 0 1px var(--border); + --elevation-2-fill: var(--surface); + --shadow-3: 0 16px 40px oklch(0 0 0 / 18%), 0 0 0 1px var(--border); + --elevation-3-fill: var(--surface); + --duration-fast: 100ms; + --duration-base: 160ms; + --duration-slow: 240ms; + --duration-xslow: 400ms; + --ease-standard: cubic-bezier(0.2, 0, 0, 1); + --ease-exit: cubic-bezier(0.4, 0, 1, 1); + --ease-spring: cubic-bezier(0.34, 1.3, 0.64, 1); + --font-ui: var(--font-onest, "Onest"), system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; + --font-serif: var(--font-source-serif, "Source Serif 4"), Georgia, serif; + --font-mono: + var(--font-source-code, "Source Code Pro"), ui-monospace, SFMono-Regular, Menlo, monospace; +} + +.dark { + --background: oklch(0.16 0.012 240); + --surface: oklch(0.2 0.014 240); + --surface-2: oklch(0.24 0.016 240); + --surface-3: oklch(0.28 0.018 240); + --rail: oklch(0.13 0.012 240); + --foreground: oklch(0.95 0.008 90); + --foreground-muted: oklch(0.72 0.014 240); + --foreground-subtle: oklch(0.6 0.014 240); + --border: oklch(1 0 0 / 12%); + --border-strong: oklch(1 0 0 / 24%); + --primary: oklch(0.78 0.1 200); + --primary-foreground: oklch(0.16 0.03 235); + --primary-soft: oklch(0.3 0.045 205); + --primary-soft-foreground: oklch(0.92 0.03 200); + --ring: oklch(0.8 0.11 200); + --destructive: oklch(0.72 0.17 22); + --destructive-foreground: oklch(0.16 0.03 25); + --destructive-soft: oklch(0.3 0.06 25); + --success: oklch(0.74 0.13 155); + --warning: oklch(0.82 0.13 80); + --warning-foreground: oklch(0.2 0.04 70); + --info: oklch(0.76 0.1 250); + --overlay: oklch(0 0 0 / 60%); + --app-home: oklch(0.74 0.1 205); + --app-home-soft: oklch(0.3 0.05 205); + --app-drive: oklch(0.74 0.1 250); + --app-drive-soft: oklch(0.3 0.05 250); + --app-docs: oklch(0.74 0.1 280); + --app-docs-soft: oklch(0.3 0.05 280); + --app-tasks: oklch(0.74 0.1 150); + --app-tasks-soft: oklch(0.3 0.05 150); + --app-calendar: oklch(0.74 0.1 40); + --app-calendar-soft: oklch(0.3 0.05 40); + --app-contacts: oklch(0.74 0.1 320); + --app-contacts-soft: oklch(0.3 0.05 320); + --app-notes: oklch(0.74 0.1 85); + --app-notes-soft: oklch(0.3 0.05 85); + --app-photos: oklch(0.74 0.1 350); + --app-photos-soft: oklch(0.3 0.05 350); + --app-chat: oklch(0.74 0.1 300); + --app-chat-soft: oklch(0.3 0.05 300); + --app-sheets: oklch(0.74 0.1 170); + --app-sheets-soft: oklch(0.3 0.05 170); + --app-mail: oklch(0.74 0.1 20); + --app-mail-soft: oklch(0.3 0.05 20); + --app-music: oklch(0.74 0.1 335); + --app-music-soft: oklch(0.3 0.05 335); + --app-money: oklch(0.74 0.1 130); + --app-money-soft: oklch(0.3 0.05 130); + --app-health: oklch(0.74 0.1 10); + --app-health-soft: oklch(0.3 0.05 10); + --app-permissions: oklch(0.74 0.1 225); + --app-permissions-soft: oklch(0.3 0.05 225); + --glyph: oklch(0.16 0.012 240); + --shadow-1: 0 0 0 1px var(--border); + --elevation-1-fill: var(--surface-2); + --shadow-2: 0 0 0 1px var(--border-strong); + --elevation-2-fill: var(--surface-2); + --shadow-3: 0 0 0 1px var(--border-strong); + --elevation-3-fill: var(--surface-3); +} + +@media (prefers-reduced-motion: reduce) { + :root { + --duration-fast: 0ms; + --duration-base: 0ms; + --duration-slow: 0ms; + --duration-xslow: 0ms; + } +} diff --git a/packages/suite-ui/src/tokens.ts b/packages/suite-ui/src/tokens.ts new file mode 100644 index 000000000..acd7bdbab --- /dev/null +++ b/packages/suite-ui/src/tokens.ts @@ -0,0 +1,1123 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +/** Frozen transcription of 01-design-system §2.1–2.7; CSS remains the runtime source. */ +export interface SuiteToken { + readonly name: `--${string}`; + readonly light: string; + readonly dark: string; + readonly use: string; + readonly category: + | "colour" + | "typography" + | "spacing" + | "sizing" + | "radius" + | "elevation" + | "motion" + | "density"; + readonly tag?: "graphic"; + readonly compact?: string; +} +export const tokens = [ + { + name: "--background", + light: "oklch(0.985 0.004 85)", + dark: "oklch(0.16 0.012 240)", + use: "page", + category: "colour", + }, + { + name: "--surface", + light: "oklch(1 0 0)", + dark: "oklch(0.20 0.014 240)", + use: "cards, sidebar panels", + category: "colour", + }, + { + name: "--surface-2", + light: "oklch(0.965 0.006 85)", + dark: "oklch(0.24 0.016 240)", + use: "wells, table header, hover rows", + category: "colour", + }, + { + name: "--surface-3", + light: "oklch(0.94 0.008 85)", + dark: "oklch(0.28 0.018 240)", + use: "pressed, selected rows", + category: "colour", + }, + { + name: "--rail", + light: "oklch(0.22 0.02 240)", + dark: "oklch(0.13 0.012 240)", + use: "the 56px app rail (always dark)", + category: "colour", + }, + { + name: "--rail-foreground", + light: "oklch(0.92 0.01 240)", + dark: "oklch(0.92 0.01 240)", + use: "", + category: "colour", + }, + { + name: "--foreground", + light: "oklch(0.20 0.02 240)", + dark: "oklch(0.95 0.008 90)", + use: "body text", + category: "colour", + }, + { + name: "--foreground-muted", + light: "oklch(0.47 0.018 240)", + dark: "oklch(0.72 0.014 240)", + use: "secondary text (4.6:1 / 7:1)", + category: "colour", + }, + { + name: "--foreground-subtle", + light: "oklch(0.60 0.015 240)", + dark: "oklch(0.60 0.014 240)", + use: "placeholders, disabled (\u22653:1 only; never for essential text)", + category: "colour", + }, + { + name: "--border", + light: "oklch(0.90 0.008 85)", + dark: "oklch(1 0 0 / 12%)", + use: "hairlines", + category: "colour", + }, + { + name: "--border-strong", + light: "oklch(0.80 0.012 240)", + dark: "oklch(1 0 0 / 24%)", + use: "inputs, focused cards", + category: "colour", + }, + { + name: "--primary", + light: "oklch(0.46 0.085 205)", + dark: "oklch(0.78 0.10 200)", + use: "buttons, links, active nav (ink-teal)", + category: "colour", + }, + { + name: "--primary-foreground", + light: "oklch(0.99 0.004 200)", + dark: "oklch(0.16 0.03 235)", + use: "", + category: "colour", + }, + { + name: "--primary-soft", + light: "oklch(0.94 0.03 200)", + dark: "oklch(0.30 0.045 205)", + use: "selected item tint, active chip", + category: "colour", + }, + { + name: "--primary-soft-foreground", + light: "oklch(0.30 0.06 210)", + dark: "oklch(0.92 0.03 200)", + use: "", + category: "colour", + }, + { + name: "--ring", + light: "oklch(0.60 0.12 205)", + dark: "oklch(0.80 0.11 200)", + use: "focus ring (2px, 2px offset)", + category: "colour", + }, + { + name: "--destructive", + light: "oklch(0.52 0.19 27)", + dark: "oklch(0.72 0.17 22)", + use: "delete, revoke", + category: "colour", + }, + { + name: "--destructive-foreground", + light: "oklch(0.99 0 0)", + dark: "oklch(0.16 0.03 25)", + use: "", + category: "colour", + }, + { + name: "--destructive-soft", + light: "oklch(0.95 0.03 25)", + dark: "oklch(0.30 0.06 25)", + use: "", + category: "colour", + }, + { + name: "--success", + light: "oklch(0.52 0.12 155)", + dark: "oklch(0.74 0.13 155)", + use: "saved, online", + category: "colour", + }, + { + name: "--warning", + light: "oklch(0.62 0.14 75)", + dark: "oklch(0.82 0.13 80)", + use: "offline, pending, expiring", + category: "colour", + }, + { + name: "--warning-foreground", + light: "oklch(0.25 0.05 70)", + dark: "oklch(0.20 0.04 70)", + use: "", + category: "colour", + }, + { + name: "--info", + light: "oklch(0.52 0.11 250)", + dark: "oklch(0.76 0.10 250)", + use: "hints", + category: "colour", + }, + { + name: "--overlay", + light: "oklch(0.2 0.02 240 / 45%)", + dark: "oklch(0 0 0 / 60%)", + use: "dialog scrim", + category: "colour", + }, + { + name: "--app-home", + light: "oklch(0.50 0.11 205)", + dark: "oklch(0.74 0.10 205)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-home-soft", + light: "oklch(0.94 0.03 205)", + dark: "oklch(0.30 0.05 205)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-home", + light: "oklch(0.60 0.14 205)", + dark: "oklch(0.60 0.14 205)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-drive", + light: "oklch(0.50 0.11 250)", + dark: "oklch(0.74 0.10 250)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-drive-soft", + light: "oklch(0.94 0.03 250)", + dark: "oklch(0.30 0.05 250)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-drive", + light: "oklch(0.60 0.14 250)", + dark: "oklch(0.60 0.14 250)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-docs", + light: "oklch(0.50 0.11 280)", + dark: "oklch(0.74 0.10 280)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-docs-soft", + light: "oklch(0.94 0.03 280)", + dark: "oklch(0.30 0.05 280)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-docs", + light: "oklch(0.60 0.14 280)", + dark: "oklch(0.60 0.14 280)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-tasks", + light: "oklch(0.50 0.11 150)", + dark: "oklch(0.74 0.10 150)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-tasks-soft", + light: "oklch(0.94 0.03 150)", + dark: "oklch(0.30 0.05 150)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-tasks", + light: "oklch(0.60 0.14 150)", + dark: "oklch(0.60 0.14 150)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-calendar", + light: "oklch(0.50 0.11 40)", + dark: "oklch(0.74 0.10 40)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-calendar-soft", + light: "oklch(0.94 0.03 40)", + dark: "oklch(0.30 0.05 40)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-calendar", + light: "oklch(0.60 0.14 40)", + dark: "oklch(0.60 0.14 40)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-contacts", + light: "oklch(0.50 0.11 320)", + dark: "oklch(0.74 0.10 320)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-contacts-soft", + light: "oklch(0.94 0.03 320)", + dark: "oklch(0.30 0.05 320)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-contacts", + light: "oklch(0.60 0.14 320)", + dark: "oklch(0.60 0.14 320)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-notes", + light: "oklch(0.50 0.11 85)", + dark: "oklch(0.74 0.10 85)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-notes-soft", + light: "oklch(0.94 0.03 85)", + dark: "oklch(0.30 0.05 85)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-notes", + light: "oklch(0.60 0.14 85)", + dark: "oklch(0.60 0.14 85)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-photos", + light: "oklch(0.50 0.11 350)", + dark: "oklch(0.74 0.10 350)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-photos-soft", + light: "oklch(0.94 0.03 350)", + dark: "oklch(0.30 0.05 350)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-photos", + light: "oklch(0.60 0.14 350)", + dark: "oklch(0.60 0.14 350)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-chat", + light: "oklch(0.50 0.11 300)", + dark: "oklch(0.74 0.10 300)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-chat-soft", + light: "oklch(0.94 0.03 300)", + dark: "oklch(0.30 0.05 300)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-chat", + light: "oklch(0.60 0.14 300)", + dark: "oklch(0.60 0.14 300)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-sheets", + light: "oklch(0.50 0.11 170)", + dark: "oklch(0.74 0.10 170)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-sheets-soft", + light: "oklch(0.94 0.03 170)", + dark: "oklch(0.30 0.05 170)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-sheets", + light: "oklch(0.60 0.14 170)", + dark: "oklch(0.60 0.14 170)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-mail", + light: "oklch(0.50 0.11 20)", + dark: "oklch(0.74 0.10 20)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-mail-soft", + light: "oklch(0.94 0.03 20)", + dark: "oklch(0.30 0.05 20)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-mail", + light: "oklch(0.60 0.14 20)", + dark: "oklch(0.60 0.14 20)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-music", + light: "oklch(0.50 0.11 335)", + dark: "oklch(0.74 0.10 335)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-music-soft", + light: "oklch(0.94 0.03 335)", + dark: "oklch(0.30 0.05 335)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-music", + light: "oklch(0.60 0.14 335)", + dark: "oklch(0.60 0.14 335)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-money", + light: "oklch(0.50 0.11 130)", + dark: "oklch(0.74 0.10 130)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-money-soft", + light: "oklch(0.94 0.03 130)", + dark: "oklch(0.30 0.05 130)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-money", + light: "oklch(0.60 0.14 130)", + dark: "oklch(0.60 0.14 130)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-health", + light: "oklch(0.50 0.11 10)", + dark: "oklch(0.74 0.10 10)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-health-soft", + light: "oklch(0.94 0.03 10)", + dark: "oklch(0.30 0.05 10)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-health", + light: "oklch(0.60 0.14 10)", + dark: "oklch(0.60 0.14 10)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--app-permissions", + light: "oklch(0.50 0.11 225)", + dark: "oklch(0.74 0.10 225)", + use: "identifier tile; 3:1 glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--app-permissions-soft", + light: "oklch(0.94 0.03 225)", + dark: "oklch(0.30 0.05 225)", + use: "file-type badges and hover tints", + category: "colour", + }, + { + name: "--presence-permissions", + light: "oklch(0.60 0.14 225)", + dark: "oklch(0.60 0.14 225)", + use: "collaborator cursor hue", + category: "colour", + }, + { + name: "--glyph", + light: "oklch(1 0 0)", + dark: "oklch(0.16 0.012 240)", + use: "app tile glyph; mockup --glyph", + category: "colour", + tag: "graphic", + }, + { + name: "--text-xs", + light: "0.75rem", + dark: "0.75rem", + use: "badges, timestamps, kbd", + category: "typography", + }, + { + name: "--lh-xs", + light: "1rem", + dark: "1rem", + use: "badges, timestamps, kbd", + category: "typography", + }, + { + name: "--weight-xs", + light: "500", + dark: "500", + use: "badges, timestamps, kbd", + category: "typography", + }, + { + name: "--tracking-xs", + light: "0.01em", + dark: "0.01em", + use: "badges, timestamps, kbd", + category: "typography", + }, + { + name: "--text-sm", + light: "0.8125rem", + dark: "0.8125rem", + use: "dense lists, table cells, secondary", + category: "typography", + }, + { + name: "--lh-sm", + light: "1.25rem", + dark: "1.25rem", + use: "dense lists, table cells, secondary", + category: "typography", + }, + { + name: "--weight-sm", + light: "400", + dark: "400", + use: "dense lists, table cells, secondary", + category: "typography", + }, + { + name: "--tracking-sm", + light: "0", + dark: "0", + use: "dense lists, table cells, secondary", + category: "typography", + }, + { + name: "--text-base", + light: "0.875rem", + dark: "0.875rem", + use: "default UI text, inputs, buttons", + category: "typography", + }, + { + name: "--lh-base", + light: "1.375rem", + dark: "1.375rem", + use: "default UI text, inputs, buttons", + category: "typography", + }, + { + name: "--weight-base", + light: "400", + dark: "400", + use: "default UI text, inputs, buttons", + category: "typography", + }, + { + name: "--tracking-base", + light: "0", + dark: "0", + use: "default UI text, inputs, buttons", + category: "typography", + }, + { + name: "--text-md", + light: "1rem", + dark: "1rem", + use: "reading text, dialog body, Docs UI chrome", + category: "typography", + }, + { + name: "--lh-md", + light: "1.5rem", + dark: "1.5rem", + use: "reading text, dialog body, Docs UI chrome", + category: "typography", + }, + { + name: "--weight-md", + light: "400", + dark: "400", + use: "reading text, dialog body, Docs UI chrome", + category: "typography", + }, + { + name: "--tracking-md", + light: "0", + dark: "0", + use: "reading text, dialog body, Docs UI chrome", + category: "typography", + }, + { + name: "--text-lg", + light: "1.125rem", + dark: "1.125rem", + use: "card titles, section headings", + category: "typography", + }, + { + name: "--lh-lg", + light: "1.625rem", + dark: "1.625rem", + use: "card titles, section headings", + category: "typography", + }, + { + name: "--weight-lg", + light: "600", + dark: "600", + use: "card titles, section headings", + category: "typography", + }, + { + name: "--tracking-lg", + light: "-0.005em", + dark: "-0.005em", + use: "card titles, section headings", + category: "typography", + }, + { + name: "--text-xl", + light: "1.375rem", + dark: "1.375rem", + use: "page titles", + category: "typography", + }, + { + name: "--lh-xl", + light: "1.75rem", + dark: "1.75rem", + use: "page titles", + category: "typography", + }, + { + name: "--weight-xl", + light: "600", + dark: "600", + use: "page titles", + category: "typography", + }, + { + name: "--tracking-xl", + light: "-0.01em", + dark: "-0.01em", + use: "page titles", + category: "typography", + }, + { + name: "--text-2xl", + light: "1.75rem", + dark: "1.75rem", + use: "Home greeting, onboarding", + category: "typography", + }, + { + name: "--lh-2xl", + light: "2.125rem", + dark: "2.125rem", + use: "Home greeting, onboarding", + category: "typography", + }, + { + name: "--weight-2xl", + light: "600", + dark: "600", + use: "Home greeting, onboarding", + category: "typography", + }, + { + name: "--tracking-2xl", + light: "-0.015em", + dark: "-0.015em", + use: "Home greeting, onboarding", + category: "typography", + }, + { + name: "--text-3xl", + light: "2.25rem", + dark: "2.25rem", + use: "welcome page only", + category: "typography", + }, + { + name: "--lh-3xl", + light: "2.625rem", + dark: "2.625rem", + use: "welcome page only", + category: "typography", + }, + { + name: "--weight-3xl", + light: "600", + dark: "600", + use: "welcome page only", + category: "typography", + }, + { + name: "--tracking-3xl", + light: "-0.02em", + dark: "-0.02em", + use: "welcome page only", + category: "typography", + }, + { + name: "--space-0.5", + light: "2px", + dark: "2px", + use: "", + category: "spacing", + }, + { + name: "--space-1", + light: "4px", + dark: "4px", + use: "", + category: "spacing", + }, + { + name: "--space-1.5", + light: "6px", + dark: "6px", + use: "", + category: "spacing", + }, + { + name: "--space-2", + light: "8px", + dark: "8px", + use: "", + category: "spacing", + }, + { + name: "--space-3", + light: "12px", + dark: "12px", + use: "", + category: "spacing", + }, + { + name: "--space-4", + light: "16px", + dark: "16px", + use: "", + category: "spacing", + }, + { + name: "--space-5", + light: "20px", + dark: "20px", + use: "", + category: "spacing", + }, + { + name: "--space-6", + light: "24px", + dark: "24px", + use: "", + category: "spacing", + }, + { + name: "--space-8", + light: "32px", + dark: "32px", + use: "", + category: "spacing", + }, + { + name: "--space-10", + light: "40px", + dark: "40px", + use: "", + category: "spacing", + }, + { + name: "--space-12", + light: "48px", + dark: "48px", + use: "", + category: "spacing", + }, + { + name: "--space-16", + light: "64px", + dark: "64px", + use: "", + category: "spacing", + }, + { + name: "--rail-w", + light: "56px", + dark: "56px", + use: "", + category: "sizing", + }, + { + name: "--sidebar-w", + light: "264px", + dark: "264px", + use: "", + category: "sizing", + }, + { + name: "--topbar-h", + light: "56px", + dark: "56px", + use: "", + category: "sizing", + }, + { + name: "--topbar-h-mobile", + light: "48px", + dark: "48px", + use: "", + category: "sizing", + }, + { + name: "--page-docs-w", + light: "816px", + dark: "816px", + use: "", + category: "sizing", + }, + { + name: "--page-settings-w", + light: "720px", + dark: "720px", + use: "", + category: "sizing", + }, + { + name: "--page-permissions-w", + light: "880px", + dark: "880px", + use: "", + category: "sizing", + }, + { + name: "--dialog-sm", + light: "420px", + dark: "420px", + use: "", + category: "sizing", + }, + { + name: "--dialog-md", + light: "560px", + dark: "560px", + use: "", + category: "sizing", + }, + { + name: "--dialog-lg", + light: "720px", + dark: "720px", + use: "", + category: "sizing", + }, + { + name: "--dialog-xl", + light: "960px", + dark: "960px", + use: "", + category: "sizing", + }, + { + name: "--radius-sm", + light: "4px", + dark: "4px", + use: "", + category: "radius", + }, + { + name: "--radius-md", + light: "6px", + dark: "6px", + use: "", + category: "radius", + }, + { + name: "--radius-lg", + light: "10px", + dark: "10px", + use: "", + category: "radius", + }, + { + name: "--radius-xl", + light: "16px", + dark: "16px", + use: "", + category: "radius", + }, + { + name: "--radius-full", + light: "9999px", + dark: "9999px", + use: "", + category: "radius", + }, + { + name: "--radius", + light: "6px", + dark: "6px", + use: "shadcn base radius", + category: "radius", + }, + { + name: "--elevation-0-border", + light: "1px solid var(--border)", + dark: "1px solid var(--border)", + use: "cards at rest, list rows", + category: "elevation", + }, + { + name: "--shadow-1", + light: "0 1px 2px oklch(0 0 0 / 6%), 0 0 0 1px var(--border)", + dark: "0 0 0 1px var(--border)", + use: "", + category: "elevation", + }, + { + name: "--elevation-1-fill", + light: "var(--surface)", + dark: "var(--surface-2)", + use: "", + category: "elevation", + }, + { + name: "--shadow-2", + light: "0 4px 12px oklch(0 0 0 / 10%), 0 0 0 1px var(--border)", + dark: "0 0 0 1px var(--border-strong)", + use: "", + category: "elevation", + }, + { + name: "--elevation-2-fill", + light: "var(--surface)", + dark: "var(--surface-2)", + use: "", + category: "elevation", + }, + { + name: "--shadow-3", + light: "0 16px 40px oklch(0 0 0 / 18%), 0 0 0 1px var(--border)", + dark: "0 0 0 1px var(--border-strong)", + use: "", + category: "elevation", + }, + { + name: "--elevation-3-fill", + light: "var(--surface)", + dark: "var(--surface-3)", + use: "", + category: "elevation", + }, + { + name: "--duration-fast", + light: "100ms", + dark: "100ms", + use: "hover/press tints, toggles", + category: "motion", + }, + { + name: "--duration-base", + light: "160ms", + dark: "160ms", + use: "menus, popovers, tooltips, chips", + category: "motion", + }, + { + name: "--duration-slow", + light: "240ms", + dark: "240ms", + use: "dialogs, sheets, sidebar collapse, page sections", + category: "motion", + }, + { + name: "--duration-xslow", + light: "400ms", + dark: "400ms", + use: "onboarding step transitions, pod diagram", + category: "motion", + }, + { + name: "--ease-standard", + light: "cubic-bezier(0.2, 0, 0, 1)", + dark: "cubic-bezier(0.2, 0, 0, 1)", + use: "enter + move", + category: "motion", + }, + { + name: "--ease-exit", + light: "cubic-bezier(0.4, 0, 1, 1)", + dark: "cubic-bezier(0.4, 0, 1, 1)", + use: "exit", + category: "motion", + }, + { + name: "--ease-spring", + light: "cubic-bezier(0.34, 1.3, 0.64, 1)", + dark: "cubic-bezier(0.34, 1.3, 0.64, 1)", + use: "drag-drop landing, task completion check", + category: "motion", + }, + { + name: "--row-h", + light: "44px", + dark: "44px", + use: "", + category: "density", + compact: "32px", + }, + { + name: "--row-h-grid-card", + light: "200px", + dark: "200px", + use: "", + category: "density", + compact: "160px", + }, + { + name: "--control-h", + light: "36px", + dark: "36px", + use: "", + category: "density", + compact: "32px", + }, + { + name: "--control-h-sm", + light: "28px", + dark: "28px", + use: "", + category: "density", + compact: "24px", + }, + { + name: "--cell-px", + light: "12px", + dark: "12px", + use: "", + category: "density", + compact: "8px", + }, + { + name: "--text-row", + light: "var(--text-base)", + dark: "var(--text-base)", + use: "", + category: "density", + compact: "var(--text-sm)", + }, + { + name: "--font-ui", + light: 'var(--font-onest, "Onest"), system-ui, -apple-system, "Segoe UI", Roboto, sans-serif', + dark: 'var(--font-onest, "Onest"), system-ui, -apple-system, "Segoe UI", Roboto, sans-serif', + use: "", + category: "typography", + }, + { + name: "--font-serif", + light: 'var(--font-source-serif, "Source Serif 4"), Georgia, serif', + dark: 'var(--font-source-serif, "Source Serif 4"), Georgia, serif', + use: "", + category: "typography", + }, + { + name: "--font-mono", + light: + 'var(--font-source-code, "Source Code Pro"), ui-monospace, SFMono-Regular, Menlo, monospace', + dark: 'var(--font-source-code, "Source Code Pro"), ui-monospace, SFMono-Regular, Menlo, monospace', + use: "", + category: "typography", + }, +] as const satisfies readonly SuiteToken[]; +export type TokenName = (typeof tokens)[number]["name"]; diff --git a/packages/suite-ui/test/spec-tokens.json b/packages/suite-ui/test/spec-tokens.json new file mode 100644 index 000000000..04f7f9f42 --- /dev/null +++ b/packages/suite-ui/test/spec-tokens.json @@ -0,0 +1,1102 @@ +[ + { + "name": "--background", + "light": "oklch(0.985 0.004 85)", + "dark": "oklch(0.16 0.012 240)", + "use": "page", + "category": "colour" + }, + { + "name": "--surface", + "light": "oklch(1 0 0)", + "dark": "oklch(0.20 0.014 240)", + "use": "cards, sidebar panels", + "category": "colour" + }, + { + "name": "--surface-2", + "light": "oklch(0.965 0.006 85)", + "dark": "oklch(0.24 0.016 240)", + "use": "wells, table header, hover rows", + "category": "colour" + }, + { + "name": "--surface-3", + "light": "oklch(0.94 0.008 85)", + "dark": "oklch(0.28 0.018 240)", + "use": "pressed, selected rows", + "category": "colour" + }, + { + "name": "--rail", + "light": "oklch(0.22 0.02 240)", + "dark": "oklch(0.13 0.012 240)", + "use": "the 56px app rail (always dark)", + "category": "colour" + }, + { + "name": "--rail-foreground", + "light": "oklch(0.92 0.01 240)", + "dark": "oklch(0.92 0.01 240)", + "use": "", + "category": "colour" + }, + { + "name": "--foreground", + "light": "oklch(0.20 0.02 240)", + "dark": "oklch(0.95 0.008 90)", + "use": "body text", + "category": "colour" + }, + { + "name": "--foreground-muted", + "light": "oklch(0.47 0.018 240)", + "dark": "oklch(0.72 0.014 240)", + "use": "secondary text (4.6:1 / 7:1)", + "category": "colour" + }, + { + "name": "--foreground-subtle", + "light": "oklch(0.60 0.015 240)", + "dark": "oklch(0.60 0.014 240)", + "use": "placeholders, disabled (≥3:1 only; never for essential text)", + "category": "colour" + }, + { + "name": "--border", + "light": "oklch(0.90 0.008 85)", + "dark": "oklch(1 0 0 / 12%)", + "use": "hairlines", + "category": "colour" + }, + { + "name": "--border-strong", + "light": "oklch(0.80 0.012 240)", + "dark": "oklch(1 0 0 / 24%)", + "use": "inputs, focused cards", + "category": "colour" + }, + { + "name": "--primary", + "light": "oklch(0.46 0.085 205)", + "dark": "oklch(0.78 0.10 200)", + "use": "buttons, links, active nav (ink-teal)", + "category": "colour" + }, + { + "name": "--primary-foreground", + "light": "oklch(0.99 0.004 200)", + "dark": "oklch(0.16 0.03 235)", + "use": "", + "category": "colour" + }, + { + "name": "--primary-soft", + "light": "oklch(0.94 0.03 200)", + "dark": "oklch(0.30 0.045 205)", + "use": "selected item tint, active chip", + "category": "colour" + }, + { + "name": "--primary-soft-foreground", + "light": "oklch(0.30 0.06 210)", + "dark": "oklch(0.92 0.03 200)", + "use": "", + "category": "colour" + }, + { + "name": "--ring", + "light": "oklch(0.60 0.12 205)", + "dark": "oklch(0.80 0.11 200)", + "use": "focus ring (2px, 2px offset)", + "category": "colour" + }, + { + "name": "--destructive", + "light": "oklch(0.52 0.19 27)", + "dark": "oklch(0.72 0.17 22)", + "use": "delete, revoke", + "category": "colour" + }, + { + "name": "--destructive-foreground", + "light": "oklch(0.99 0 0)", + "dark": "oklch(0.16 0.03 25)", + "use": "", + "category": "colour" + }, + { + "name": "--destructive-soft", + "light": "oklch(0.95 0.03 25)", + "dark": "oklch(0.30 0.06 25)", + "use": "", + "category": "colour" + }, + { + "name": "--success", + "light": "oklch(0.52 0.12 155)", + "dark": "oklch(0.74 0.13 155)", + "use": "saved, online", + "category": "colour" + }, + { + "name": "--warning", + "light": "oklch(0.62 0.14 75)", + "dark": "oklch(0.82 0.13 80)", + "use": "offline, pending, expiring", + "category": "colour" + }, + { + "name": "--warning-foreground", + "light": "oklch(0.25 0.05 70)", + "dark": "oklch(0.20 0.04 70)", + "use": "", + "category": "colour" + }, + { + "name": "--info", + "light": "oklch(0.52 0.11 250)", + "dark": "oklch(0.76 0.10 250)", + "use": "hints", + "category": "colour" + }, + { + "name": "--overlay", + "light": "oklch(0.2 0.02 240 / 45%)", + "dark": "oklch(0 0 0 / 60%)", + "use": "dialog scrim", + "category": "colour" + }, + { + "name": "--app-home", + "light": "oklch(0.50 0.11 205)", + "dark": "oklch(0.74 0.10 205)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-home-soft", + "light": "oklch(0.94 0.03 205)", + "dark": "oklch(0.30 0.05 205)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-home", + "light": "oklch(0.60 0.14 205)", + "dark": "oklch(0.60 0.14 205)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-drive", + "light": "oklch(0.50 0.11 250)", + "dark": "oklch(0.74 0.10 250)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-drive-soft", + "light": "oklch(0.94 0.03 250)", + "dark": "oklch(0.30 0.05 250)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-drive", + "light": "oklch(0.60 0.14 250)", + "dark": "oklch(0.60 0.14 250)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-docs", + "light": "oklch(0.50 0.11 280)", + "dark": "oklch(0.74 0.10 280)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-docs-soft", + "light": "oklch(0.94 0.03 280)", + "dark": "oklch(0.30 0.05 280)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-docs", + "light": "oklch(0.60 0.14 280)", + "dark": "oklch(0.60 0.14 280)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-tasks", + "light": "oklch(0.50 0.11 150)", + "dark": "oklch(0.74 0.10 150)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-tasks-soft", + "light": "oklch(0.94 0.03 150)", + "dark": "oklch(0.30 0.05 150)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-tasks", + "light": "oklch(0.60 0.14 150)", + "dark": "oklch(0.60 0.14 150)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-calendar", + "light": "oklch(0.50 0.11 40)", + "dark": "oklch(0.74 0.10 40)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-calendar-soft", + "light": "oklch(0.94 0.03 40)", + "dark": "oklch(0.30 0.05 40)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-calendar", + "light": "oklch(0.60 0.14 40)", + "dark": "oklch(0.60 0.14 40)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-contacts", + "light": "oklch(0.50 0.11 320)", + "dark": "oklch(0.74 0.10 320)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-contacts-soft", + "light": "oklch(0.94 0.03 320)", + "dark": "oklch(0.30 0.05 320)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-contacts", + "light": "oklch(0.60 0.14 320)", + "dark": "oklch(0.60 0.14 320)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-notes", + "light": "oklch(0.50 0.11 85)", + "dark": "oklch(0.74 0.10 85)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-notes-soft", + "light": "oklch(0.94 0.03 85)", + "dark": "oklch(0.30 0.05 85)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-notes", + "light": "oklch(0.60 0.14 85)", + "dark": "oklch(0.60 0.14 85)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-photos", + "light": "oklch(0.50 0.11 350)", + "dark": "oklch(0.74 0.10 350)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-photos-soft", + "light": "oklch(0.94 0.03 350)", + "dark": "oklch(0.30 0.05 350)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-photos", + "light": "oklch(0.60 0.14 350)", + "dark": "oklch(0.60 0.14 350)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-chat", + "light": "oklch(0.50 0.11 300)", + "dark": "oklch(0.74 0.10 300)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-chat-soft", + "light": "oklch(0.94 0.03 300)", + "dark": "oklch(0.30 0.05 300)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-chat", + "light": "oklch(0.60 0.14 300)", + "dark": "oklch(0.60 0.14 300)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-sheets", + "light": "oklch(0.50 0.11 170)", + "dark": "oklch(0.74 0.10 170)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-sheets-soft", + "light": "oklch(0.94 0.03 170)", + "dark": "oklch(0.30 0.05 170)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-sheets", + "light": "oklch(0.60 0.14 170)", + "dark": "oklch(0.60 0.14 170)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-mail", + "light": "oklch(0.50 0.11 20)", + "dark": "oklch(0.74 0.10 20)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-mail-soft", + "light": "oklch(0.94 0.03 20)", + "dark": "oklch(0.30 0.05 20)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-mail", + "light": "oklch(0.60 0.14 20)", + "dark": "oklch(0.60 0.14 20)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-music", + "light": "oklch(0.50 0.11 335)", + "dark": "oklch(0.74 0.10 335)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-music-soft", + "light": "oklch(0.94 0.03 335)", + "dark": "oklch(0.30 0.05 335)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-music", + "light": "oklch(0.60 0.14 335)", + "dark": "oklch(0.60 0.14 335)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-money", + "light": "oklch(0.50 0.11 130)", + "dark": "oklch(0.74 0.10 130)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-money-soft", + "light": "oklch(0.94 0.03 130)", + "dark": "oklch(0.30 0.05 130)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-money", + "light": "oklch(0.60 0.14 130)", + "dark": "oklch(0.60 0.14 130)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-health", + "light": "oklch(0.50 0.11 10)", + "dark": "oklch(0.74 0.10 10)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-health-soft", + "light": "oklch(0.94 0.03 10)", + "dark": "oklch(0.30 0.05 10)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-health", + "light": "oklch(0.60 0.14 10)", + "dark": "oklch(0.60 0.14 10)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--app-permissions", + "light": "oklch(0.50 0.11 225)", + "dark": "oklch(0.74 0.10 225)", + "use": "identifier tile; 3:1 glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--app-permissions-soft", + "light": "oklch(0.94 0.03 225)", + "dark": "oklch(0.30 0.05 225)", + "use": "file-type badges and hover tints", + "category": "colour" + }, + { + "name": "--presence-permissions", + "light": "oklch(0.60 0.14 225)", + "dark": "oklch(0.60 0.14 225)", + "use": "collaborator cursor hue", + "category": "colour" + }, + { + "name": "--glyph", + "light": "oklch(1 0 0)", + "dark": "oklch(0.16 0.012 240)", + "use": "app tile glyph; mockup --glyph", + "category": "colour", + "tag": "graphic" + }, + { + "name": "--text-xs", + "light": "0.75rem", + "dark": "0.75rem", + "use": "badges, timestamps, kbd", + "category": "typography" + }, + { + "name": "--lh-xs", + "light": "1rem", + "dark": "1rem", + "use": "badges, timestamps, kbd", + "category": "typography" + }, + { + "name": "--weight-xs", + "light": "500", + "dark": "500", + "use": "badges, timestamps, kbd", + "category": "typography" + }, + { + "name": "--tracking-xs", + "light": "0.01em", + "dark": "0.01em", + "use": "badges, timestamps, kbd", + "category": "typography" + }, + { + "name": "--text-sm", + "light": "0.8125rem", + "dark": "0.8125rem", + "use": "dense lists, table cells, secondary", + "category": "typography" + }, + { + "name": "--lh-sm", + "light": "1.25rem", + "dark": "1.25rem", + "use": "dense lists, table cells, secondary", + "category": "typography" + }, + { + "name": "--weight-sm", + "light": "400", + "dark": "400", + "use": "dense lists, table cells, secondary", + "category": "typography" + }, + { + "name": "--tracking-sm", + "light": "0", + "dark": "0", + "use": "dense lists, table cells, secondary", + "category": "typography" + }, + { + "name": "--text-base", + "light": "0.875rem", + "dark": "0.875rem", + "use": "default UI text, inputs, buttons", + "category": "typography" + }, + { + "name": "--lh-base", + "light": "1.375rem", + "dark": "1.375rem", + "use": "default UI text, inputs, buttons", + "category": "typography" + }, + { + "name": "--weight-base", + "light": "400", + "dark": "400", + "use": "default UI text, inputs, buttons", + "category": "typography" + }, + { + "name": "--tracking-base", + "light": "0", + "dark": "0", + "use": "default UI text, inputs, buttons", + "category": "typography" + }, + { + "name": "--text-md", + "light": "1rem", + "dark": "1rem", + "use": "reading text, dialog body, Docs UI chrome", + "category": "typography" + }, + { + "name": "--lh-md", + "light": "1.5rem", + "dark": "1.5rem", + "use": "reading text, dialog body, Docs UI chrome", + "category": "typography" + }, + { + "name": "--weight-md", + "light": "400", + "dark": "400", + "use": "reading text, dialog body, Docs UI chrome", + "category": "typography" + }, + { + "name": "--tracking-md", + "light": "0", + "dark": "0", + "use": "reading text, dialog body, Docs UI chrome", + "category": "typography" + }, + { + "name": "--text-lg", + "light": "1.125rem", + "dark": "1.125rem", + "use": "card titles, section headings", + "category": "typography" + }, + { + "name": "--lh-lg", + "light": "1.625rem", + "dark": "1.625rem", + "use": "card titles, section headings", + "category": "typography" + }, + { + "name": "--weight-lg", + "light": "600", + "dark": "600", + "use": "card titles, section headings", + "category": "typography" + }, + { + "name": "--tracking-lg", + "light": "-0.005em", + "dark": "-0.005em", + "use": "card titles, section headings", + "category": "typography" + }, + { + "name": "--text-xl", + "light": "1.375rem", + "dark": "1.375rem", + "use": "page titles", + "category": "typography" + }, + { + "name": "--lh-xl", + "light": "1.75rem", + "dark": "1.75rem", + "use": "page titles", + "category": "typography" + }, + { + "name": "--weight-xl", + "light": "600", + "dark": "600", + "use": "page titles", + "category": "typography" + }, + { + "name": "--tracking-xl", + "light": "-0.01em", + "dark": "-0.01em", + "use": "page titles", + "category": "typography" + }, + { + "name": "--text-2xl", + "light": "1.75rem", + "dark": "1.75rem", + "use": "Home greeting, onboarding", + "category": "typography" + }, + { + "name": "--lh-2xl", + "light": "2.125rem", + "dark": "2.125rem", + "use": "Home greeting, onboarding", + "category": "typography" + }, + { + "name": "--weight-2xl", + "light": "600", + "dark": "600", + "use": "Home greeting, onboarding", + "category": "typography" + }, + { + "name": "--tracking-2xl", + "light": "-0.015em", + "dark": "-0.015em", + "use": "Home greeting, onboarding", + "category": "typography" + }, + { + "name": "--text-3xl", + "light": "2.25rem", + "dark": "2.25rem", + "use": "welcome page only", + "category": "typography" + }, + { + "name": "--lh-3xl", + "light": "2.625rem", + "dark": "2.625rem", + "use": "welcome page only", + "category": "typography" + }, + { + "name": "--weight-3xl", + "light": "600", + "dark": "600", + "use": "welcome page only", + "category": "typography" + }, + { + "name": "--tracking-3xl", + "light": "-0.02em", + "dark": "-0.02em", + "use": "welcome page only", + "category": "typography" + }, + { + "name": "--space-0.5", + "light": "2px", + "dark": "2px", + "use": "", + "category": "spacing" + }, + { + "name": "--space-1", + "light": "4px", + "dark": "4px", + "use": "", + "category": "spacing" + }, + { + "name": "--space-1.5", + "light": "6px", + "dark": "6px", + "use": "", + "category": "spacing" + }, + { + "name": "--space-2", + "light": "8px", + "dark": "8px", + "use": "", + "category": "spacing" + }, + { + "name": "--space-3", + "light": "12px", + "dark": "12px", + "use": "", + "category": "spacing" + }, + { + "name": "--space-4", + "light": "16px", + "dark": "16px", + "use": "", + "category": "spacing" + }, + { + "name": "--space-5", + "light": "20px", + "dark": "20px", + "use": "", + "category": "spacing" + }, + { + "name": "--space-6", + "light": "24px", + "dark": "24px", + "use": "", + "category": "spacing" + }, + { + "name": "--space-8", + "light": "32px", + "dark": "32px", + "use": "", + "category": "spacing" + }, + { + "name": "--space-10", + "light": "40px", + "dark": "40px", + "use": "", + "category": "spacing" + }, + { + "name": "--space-12", + "light": "48px", + "dark": "48px", + "use": "", + "category": "spacing" + }, + { + "name": "--space-16", + "light": "64px", + "dark": "64px", + "use": "", + "category": "spacing" + }, + { + "name": "--rail-w", + "light": "56px", + "dark": "56px", + "use": "", + "category": "sizing" + }, + { + "name": "--sidebar-w", + "light": "264px", + "dark": "264px", + "use": "", + "category": "sizing" + }, + { + "name": "--topbar-h", + "light": "56px", + "dark": "56px", + "use": "", + "category": "sizing" + }, + { + "name": "--topbar-h-mobile", + "light": "48px", + "dark": "48px", + "use": "", + "category": "sizing" + }, + { + "name": "--page-docs-w", + "light": "816px", + "dark": "816px", + "use": "", + "category": "sizing" + }, + { + "name": "--page-settings-w", + "light": "720px", + "dark": "720px", + "use": "", + "category": "sizing" + }, + { + "name": "--page-permissions-w", + "light": "880px", + "dark": "880px", + "use": "", + "category": "sizing" + }, + { + "name": "--dialog-sm", + "light": "420px", + "dark": "420px", + "use": "", + "category": "sizing" + }, + { + "name": "--dialog-md", + "light": "560px", + "dark": "560px", + "use": "", + "category": "sizing" + }, + { + "name": "--dialog-lg", + "light": "720px", + "dark": "720px", + "use": "", + "category": "sizing" + }, + { + "name": "--dialog-xl", + "light": "960px", + "dark": "960px", + "use": "", + "category": "sizing" + }, + { + "name": "--radius-sm", + "light": "4px", + "dark": "4px", + "use": "", + "category": "radius" + }, + { + "name": "--radius-md", + "light": "6px", + "dark": "6px", + "use": "", + "category": "radius" + }, + { + "name": "--radius-lg", + "light": "10px", + "dark": "10px", + "use": "", + "category": "radius" + }, + { + "name": "--radius-xl", + "light": "16px", + "dark": "16px", + "use": "", + "category": "radius" + }, + { + "name": "--radius-full", + "light": "9999px", + "dark": "9999px", + "use": "", + "category": "radius" + }, + { + "name": "--radius", + "light": "6px", + "dark": "6px", + "use": "shadcn base radius", + "category": "radius" + }, + { + "name": "--elevation-0-border", + "light": "1px solid var(--border)", + "dark": "1px solid var(--border)", + "use": "cards at rest, list rows", + "category": "elevation" + }, + { + "name": "--shadow-1", + "light": "0 1px 2px oklch(0 0 0 / 6%), 0 0 0 1px var(--border)", + "dark": "0 0 0 1px var(--border)", + "use": "", + "category": "elevation" + }, + { + "name": "--elevation-1-fill", + "light": "var(--surface)", + "dark": "var(--surface-2)", + "use": "", + "category": "elevation" + }, + { + "name": "--shadow-2", + "light": "0 4px 12px oklch(0 0 0 / 10%), 0 0 0 1px var(--border)", + "dark": "0 0 0 1px var(--border-strong)", + "use": "", + "category": "elevation" + }, + { + "name": "--elevation-2-fill", + "light": "var(--surface)", + "dark": "var(--surface-2)", + "use": "", + "category": "elevation" + }, + { + "name": "--shadow-3", + "light": "0 16px 40px oklch(0 0 0 / 18%), 0 0 0 1px var(--border)", + "dark": "0 0 0 1px var(--border-strong)", + "use": "", + "category": "elevation" + }, + { + "name": "--elevation-3-fill", + "light": "var(--surface)", + "dark": "var(--surface-3)", + "use": "", + "category": "elevation" + }, + { + "name": "--duration-fast", + "light": "100ms", + "dark": "100ms", + "use": "hover/press tints, toggles", + "category": "motion" + }, + { + "name": "--duration-base", + "light": "160ms", + "dark": "160ms", + "use": "menus, popovers, tooltips, chips", + "category": "motion" + }, + { + "name": "--duration-slow", + "light": "240ms", + "dark": "240ms", + "use": "dialogs, sheets, sidebar collapse, page sections", + "category": "motion" + }, + { + "name": "--duration-xslow", + "light": "400ms", + "dark": "400ms", + "use": "onboarding step transitions, pod diagram", + "category": "motion" + }, + { + "name": "--ease-standard", + "light": "cubic-bezier(0.2, 0, 0, 1)", + "dark": "cubic-bezier(0.2, 0, 0, 1)", + "use": "enter + move", + "category": "motion" + }, + { + "name": "--ease-exit", + "light": "cubic-bezier(0.4, 0, 1, 1)", + "dark": "cubic-bezier(0.4, 0, 1, 1)", + "use": "exit", + "category": "motion" + }, + { + "name": "--ease-spring", + "light": "cubic-bezier(0.34, 1.3, 0.64, 1)", + "dark": "cubic-bezier(0.34, 1.3, 0.64, 1)", + "use": "drag-drop landing, task completion check", + "category": "motion" + }, + { + "name": "--row-h", + "light": "44px", + "dark": "44px", + "use": "", + "category": "density", + "compact": "32px" + }, + { + "name": "--row-h-grid-card", + "light": "200px", + "dark": "200px", + "use": "", + "category": "density", + "compact": "160px" + }, + { + "name": "--control-h", + "light": "36px", + "dark": "36px", + "use": "", + "category": "density", + "compact": "32px" + }, + { + "name": "--control-h-sm", + "light": "28px", + "dark": "28px", + "use": "", + "category": "density", + "compact": "24px" + }, + { + "name": "--cell-px", + "light": "12px", + "dark": "12px", + "use": "", + "category": "density", + "compact": "8px" + }, + { + "name": "--text-row", + "light": "var(--text-base)", + "dark": "var(--text-base)", + "use": "", + "category": "density", + "compact": "var(--text-sm)" + }, + { + "name": "--font-ui", + "light": "var(--font-onest, \"Onest\"), system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif", + "dark": "var(--font-onest, \"Onest\"), system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif", + "use": "", + "category": "typography" + }, + { + "name": "--font-serif", + "light": "var(--font-source-serif, \"Source Serif 4\"), Georgia, serif", + "dark": "var(--font-source-serif, \"Source Serif 4\"), Georgia, serif", + "use": "", + "category": "typography" + }, + { + "name": "--font-mono", + "light": "var(--font-source-code, \"Source Code Pro\"), ui-monospace, SFMono-Regular, Menlo, monospace", + "dark": "var(--font-source-code, \"Source Code Pro\"), ui-monospace, SFMono-Regular, Menlo, monospace", + "use": "", + "category": "typography" + } +] diff --git a/packages/suite-ui/test/tokens.test.ts b/packages/suite-ui/test/tokens.test.ts new file mode 100644 index 000000000..438e14e41 --- /dev/null +++ b/packages/suite-ui/test/tokens.test.ts @@ -0,0 +1,53 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { readFileSync } from "node:fs"; +import { expect, test } from "vitest"; +// @ts-expect-error Root script is intentionally a dependency-free ESM module. +import { declarations, normalizeCssValue, parseTokens } from "../../../scripts/token-css.mjs"; +import { tokens } from "../src/tokens.js"; + +test("exported inventory equals the frozen spec tables (§2.1–2.7)", async () => { + await expect(`${JSON.stringify(tokens, null, 2)}\n`).toMatchFileSnapshot( + new URL("./spec-tokens.json", import.meta.url).pathname, + ); + expect(new Set(tokens.map((token) => token.name)).size).toBe(tokens.length); +}); +test("CSS exactly equals every exported value in both themes and densities", () => { + const css = readFileSync(new URL("../src/styles/tokens.css", import.meta.url), "utf8"); + const density = readFileSync(new URL("../src/styles/density.css", import.meta.url), "utf8"); + const actual = parseTokens(css); + const comfortable = declarations(density.match(/comfortable"\]\s*\{([^}]+)\}/)?.[1] ?? ""); + const compact = declarations(density.match(/compact"\]\s*\{([^}]+)\}/)?.[1] ?? ""); + for (const theme of ["light", "dark"] as const) { + expect({ ...actual[theme], ...comfortable }).toEqual( + Object.fromEntries(tokens.map((t) => [t.name, normalizeCssValue(t[theme])])), + ); + } + expect(compact).toEqual( + Object.fromEntries( + tokens + .filter((t) => "compact" in t) + .map((t) => [t.name, "compact" in t ? normalizeCssValue(t.compact) : undefined]), + ), + ); +}); + +test("Tailwind theme exposes all colour tokens and the normative shadcn aliases", () => { + const theme = readFileSync(new URL("../src/styles/theme.css", import.meta.url), "utf8"); + for (const token of tokens.filter((t) => t.category === "colour")) { + expect(theme).toContain(`--color-${token.name.slice(2)}: var(${token.name});`); + } + for (const [name, target] of Object.entries({ + card: "surface", + popover: "surface", + muted: "surface-2", + "muted-foreground": "foreground-muted", + accent: "primary-soft", + "accent-foreground": "primary-soft-foreground", + input: "border-strong", + secondary: "surface-2", + "secondary-foreground": "foreground", + })) { + expect(theme).toContain(`--${name}: var(--${target});`); + expect(theme).toContain(`--color-${name}: var(--${name});`); + } +}); diff --git a/packages/suite-ui/tsconfig.build.json b/packages/suite-ui/tsconfig.build.json new file mode 100644 index 000000000..a2307d74d --- /dev/null +++ b/packages/suite-ui/tsconfig.build.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "declaration": true, + "declarationMap": false, + "sourceMap": false, + "outDir": "dist", + "rootDir": "src", + "module": "ESNext", + "moduleResolution": "bundler", + "verbatimModuleSyntax": true, + "types": [] + }, + "include": ["src"], + "exclude": ["test", "scripts", "**/*.test.ts", "**/*.test.tsx"] +} diff --git a/packages/suite-ui/tsconfig.json b/packages/suite-ui/tsconfig.json new file mode 100644 index 000000000..73ff36461 --- /dev/null +++ b/packages/suite-ui/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "noImplicitOverride": true, + "types": ["node"], + "resolveJsonModule": true + }, + "include": ["src", "test", "scripts"] +} diff --git a/packages/suite-ui/vitest.config.ts b/packages/suite-ui/vitest.config.ts new file mode 100644 index 000000000..979c659c1 --- /dev/null +++ b/packages/suite-ui/vitest.config.ts @@ -0,0 +1,3 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { defineConfig } from "vitest/config"; +export default defineConfig({ test: { environment: "node", include: ["test/**/*.test.ts"] } }); diff --git a/scripts/token-css.mjs b/scripts/token-css.mjs new file mode 100644 index 000000000..0a4fe5d80 --- /dev/null +++ b/scripts/token-css.mjs @@ -0,0 +1,21 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +/** Parse declaration blocks independently, preserving source order and CSS escaped dots. */ +export function declarations(body) { + return Object.fromEntries( + [...body.matchAll(/(--[\w.\\-]+)\s*:\s*([^;]+);/g)].map(([, name, value]) => [ + name.replaceAll("\\.", "."), + value.trim(), + ]), + ); +} +export function parseTokens(css) { + const light = declarations(css.match(/:root\s*\{([^}]+)\}/)?.[1] ?? ""); + const dark = { ...light, ...declarations(css.match(/\.dark\s*\{([^}]+)\}/)?.[1] ?? "") }; + if (Object.keys(light).length === 0) throw new Error("Missing root token block"); + return { light, dark }; +} + +/** CSS formatters canonicalise trailing decimal zeroes without changing values. */ +export function normalizeCssValue(value) { + return value.replace(/\b\d+\.\d+\b/g, (number) => String(Number(number))); +} From bbb8435cbcc60a22264ef4eee5147e172d5342d6 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 16:28:47 +0000 Subject: [PATCH 04/17] feat: validate suite token use and contrast Scan the suite app for raw colour literals and check 72 documented contrast pairs. Preserve normative values and enumerate three measured spec failures as bounded exceptions in QUESTIONS.md. Co-Authored-By: GPT-6.1-Sol (Codex) --- QUESTIONS.md | 20 ++++++ scripts/check-contrast.mjs | 35 ++++++++++ scripts/check-tokens.mjs | 78 ++++++++++++++++++++++ scripts/contrast.mjs | 88 +++++++++++++++++++++++++ test/check-tokens.test.mjs | 25 +++++++ test/contrast.test.mjs | 54 +++++++++++++++ test/fixtures/token-scanner/invalid.css | 10 +++ test/fixtures/token-scanner/valid.tsx | 5 ++ 8 files changed, 315 insertions(+) create mode 100644 QUESTIONS.md create mode 100644 scripts/check-contrast.mjs create mode 100644 scripts/check-tokens.mjs create mode 100644 scripts/contrast.mjs create mode 100644 test/check-tokens.test.mjs create mode 100644 test/contrast.test.mjs create mode 100644 test/fixtures/token-scanner/invalid.css create mode 100644 test/fixtures/token-scanner/valid.tsx diff --git a/QUESTIONS.md b/QUESTIONS.md new file mode 100644 index 000000000..c91a7fd87 --- /dev/null +++ b/QUESTIONS.md @@ -0,0 +1,20 @@ + +# DS-01 questions + +1. **01 §2.1 and §7: normative contrast failures.** Should the spec amend the colours, or explicitly reduce the claimed thresholds? Conservative implementation: preserve every normative value and report only the exact theme/pair/measurement below as a known spec issue. Alpha borders are composited over the named background in encoded sRGB; out-of-gamut channels are clipped to sRGB. + +| Theme | Foreground | Background | Measured | Required | +|---|---|---|---|---| +| light | `--warning-foreground` | `--warning` | 4.331:1 | 4.5:1 | +| light | `--border-strong` | `--background` | 1.786:1 | 3:1 | +| dark | `--border-strong` | `--background` | 2.095:1 | 3:1 | + +Machine-readable entries used by `check:contrast` (stale entries fail the gate): + + + + + +2. **01 §2.3–2.7: unnamed supporting tokens.** Options: invent a second naming scheme, or reuse the reference mockups. Conservative reading: use mockup names (`--lh-*`, `--font-*`, `--shadow-*`, `--rail-w`, `--sidebar-w`, `--topbar-h`, `--radius-full: 9999px`); add descriptive names only for sizes/weights/tracking explicitly specified but unnamed. Density values live in `density.css`; the typed inventory includes both densities. Dark elevation fills are separate fill tokens. No application chrome is added. + +3. **01 §2.7: Comfortable vs 44px touch targets.** Comfortable controls are 36px/28px, while touch requires 44px. Options: preserve control heights on touch, or enforce the explicit touch minimum. Conservative reading: retain Comfortable row/grid/text/cell values and raise both control height tokens to 44px on coarse pointers. diff --git a/scripts/check-contrast.mjs b/scripts/check-contrast.mjs new file mode 100644 index 000000000..d445c79b9 --- /dev/null +++ b/scripts/check-contrast.mjs @@ -0,0 +1,35 @@ +#!/usr/bin/env node +// AUTHORED-BY Codex GPT-6.1-Sol +import { existsSync, readFileSync } from "node:fs"; +import { contrastIssues, evaluateContrast } from "./contrast.mjs"; +import { parseTokens } from "./token-css.mjs"; + +const css = readFileSync( + new URL("../packages/suite-ui/src/styles/tokens.css", import.meta.url), + "utf8", +); +const questions = new URL("../QUESTIONS.md", import.meta.url); +const known = contrastIssues(existsSync(questions) ? readFileSync(questions, "utf8") : ""); +const results = evaluateContrast(parseTokens(css), known); +console.table( + results.map((row) => ({ + theme: row.theme, + foreground: row.fg, + background: row.bg, + ratio: row.ratio.toFixed(3), + minimum: row.minimum, + status: row.status, + })), +); +const failures = results.filter((row) => row.status === "FAIL"); +const stale = [...known.keys()].filter( + (key) => + !results.some( + (row) => `${row.theme}|${row.fg}|${row.bg}` === key && row.status === "KNOWN SPEC ISSUE", + ), +); +if (stale.length) console.error("Stale spec issue entries:", stale); +console.log( + `${results.length} pairs; ${results.filter((row) => row.status === "KNOWN SPEC ISSUE").length} known spec issues; ${failures.length} failures.`, +); +process.exitCode = failures.length || stale.length ? 1 : 0; diff --git a/scripts/check-tokens.mjs b/scripts/check-tokens.mjs new file mode 100644 index 000000000..2b2a80878 --- /dev/null +++ b/scripts/check-tokens.mjs @@ -0,0 +1,78 @@ +#!/usr/bin/env node +// AUTHORED-BY Codex GPT-6.1-Sol +import { readdirSync, readFileSync } from "node:fs"; +import { extname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +/** Blank comments while retaining offsets/lines and colour literals inside strings. */ +export function withoutComments(source) { + let result = ""; + let quote = ""; + for (let i = 0; i < source.length; ) { + const char = source[i]; + if (quote) { + result += char; + i++; + if (char === "\\" && i < source.length) result += source[i++]; + else if (char === quote) quote = ""; + } else if (char === '"' || char === "'" || char === "`") { + quote = char; + result += char; + i++; + } else { + const end = source.startsWith("/*", i) + ? "*/" + : source.startsWith("" + : source.startsWith("//", i) + ? "\n" + : null; + if (!end) { + result += char; + i++; + continue; + } + const stop = source.indexOf(end, i + 2); + const next = stop < 0 ? source.length : stop + (end === "\n" ? 0 : end.length); + result += source.slice(i, next).replace(/[^\n]/g, " "); + i = next; + } + } + return result; +} +export function scanColours(source) { + const stripped = withoutComments(source); + return [ + ...stripped.matchAll( + /#[\da-f]{8}\b|#[\da-f]{6}\b|#[\da-f]{4}\b|#[\da-f]{3}\b|\b(?:oklch|rgba?|hsla?)\s*\(/gi, + ), + ].map((match) => ({ + literal: match[0], + line: stripped.slice(0, match.index).split("\n").length, + })); +} +export function scanDirectory(directory) { + const failures = []; + for (const entry of readdirSync(directory, { withFileTypes: true })) { + if (["node_modules", ".next", "dist", "artifacts", "coverage"].includes(entry.name)) continue; + const path = join(directory, entry.name); + if (entry.isDirectory()) failures.push(...scanDirectory(path)); + else if ( + entry.isFile() && + /\.(?:[cm]?[jt]sx?|css|scss|html|svg|json|mdx)$/.test(extname(path)) + ) { + failures.push( + ...scanColours(readFileSync(path, "utf8")).map((issue) => ({ path, ...issue })), + ); + } + } + return failures; +} +if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + const directory = fileURLToPath(new URL("../apps/suite/", import.meta.url)); + const failures = scanDirectory(directory); + for (const issue of failures) + console.error(`${issue.path}:${issue.line}: raw colour ${issue.literal}`); + console.log(`Suite token gate: ${failures.length} raw colour literal(s).`); + process.exitCode = failures.length ? 1 : 0; +} diff --git a/scripts/contrast.mjs b/scripts/contrast.mjs new file mode 100644 index 000000000..edd6fee36 --- /dev/null +++ b/scripts/contrast.mjs @@ -0,0 +1,88 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +// OKLab inverse matrices: https://www.w3.org/TR/css-color-4/#color-conversion-code +// WCAG luminance/ratio: https://www.w3.org/TR/WCAG22/#dfn-relative-luminance +const clamp = (value) => Math.min(1, Math.max(0, value)); +const encode = (value) => (value <= 0.0031308 ? 12.92 * value : 1.055 * value ** (1 / 2.4) - 0.055); +const decode = (value) => (value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4); +export function oklchToSrgb(value) { + const match = value.match(/^oklch\(([\d.]+) ([\d.]+) ([\d.]+)(?:\s*\/\s*([\d.]+)(%)?)?\)$/); + if (!match) throw new Error(`Unsupported colour: ${value}`); + const [, lv, cv, hv, av, percent] = match; + const L = Number(lv), + C = Number(cv), + h = (Number(hv) * Math.PI) / 180; + const a = C * Math.cos(h), + b = C * Math.sin(h); + const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3; + const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3; + const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3; + // Clip out-of-sRGB channels before encoding; no colour dependency or hidden gamut adjustment. + return { + rgb: [ + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s, + ].map((channel) => encode(clamp(channel))), + alpha: av === undefined ? 1 : Number(av) / (percent ? 100 : 1), + }; +} +export function contrast(foreground, background) { + const fg = oklchToSrgb(foreground), + bg = oklchToSrgb(background); + if (bg.alpha !== 1) throw new Error("Contrast background must be opaque"); + // CSS source-over compositing is in encoded sRGB, before luminance linearisation. + const rgb = fg.rgb.map((channel, i) => channel * fg.alpha + bg.rgb[i] * (1 - fg.alpha)); + const luminance = (channels) => + channels.map(decode).reduce((sum, c, i) => sum + c * [0.2126, 0.7152, 0.0722][i], 0); + const f = luminance(rgb), + b = luminance(bg.rgb); + return (Math.max(f, b) + 0.05) / (Math.min(f, b) + 0.05); +} +export function documentedPairs(values) { + const pairs = []; + const add = (fg, bg, minimum = 4.5) => { + if (!pairs.some((p) => p.fg === fg && p.bg === bg)) pairs.push({ fg, bg, minimum }); + }; + for (const name of Object.keys(values)) { + if (name.endsWith("-foreground") && Object.hasOwn(values, name.slice(0, -11))) + add(name, name.slice(0, -11)); + } + for (const bg of ["--background", "--surface", "--surface-2", "--surface-3"]) { + for (const fg of ["--foreground", "--foreground-muted", "--foreground-subtle"]) + add(fg, bg, fg.endsWith("subtle") ? 3 : 4.5); + } + for (const bg of ["--background", "--surface"]) add("--primary", bg); + add("--rail-foreground", "--rail"); + add("--ring", "--background", 3); + add("--border-strong", "--background", 3); + for (const name of Object.keys(values)) if (/^--app-[a-z]+$/.test(name)) add("--glyph", name, 3); + return pairs; +} +export function contrastIssues(markdown) { + return new Map( + [ + ...markdown.matchAll( + //g, + ), + ].map(([, theme, fg, bg, ratio]) => [`${theme}|${fg}|${bg}`, Number(ratio)]), + ); +} +export function evaluateContrast(themes, known = new Map()) { + return Object.entries(themes).flatMap(([theme, values]) => + documentedPairs(values).map((pair) => { + const ratio = contrast(values[pair.fg], values[pair.bg]); + const recorded = known.get(`${theme}|${pair.fg}|${pair.bg}`); + return { + theme, + ...pair, + ratio, + status: + ratio >= pair.minimum + ? "PASS" + : recorded !== undefined && Math.abs(recorded - ratio) < 0.005 + ? "KNOWN SPEC ISSUE" + : "FAIL", + }; + }), + ); +} diff --git a/test/check-tokens.test.mjs b/test/check-tokens.test.mjs new file mode 100644 index 000000000..899c1eafa --- /dev/null +++ b/test/check-tokens.test.mjs @@ -0,0 +1,25 @@ +// AUTHORED-BY Codex GPT-6.1-Sol + +import { readFileSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import { expect, test } from "vitest"; +import { scanColours, scanDirectory } from "../scripts/check-tokens.mjs"; + +const fixture = (name) => + readFileSync(new URL(`./fixtures/token-scanner/${name}`, import.meta.url), "utf8"); +test("scanner ignores comments, retains literals inside quoted CSS/JS and URLs", () => { + expect(scanColours(fixture("valid.tsx"))).toEqual([]); + expect(scanColours(fixture("invalid.css")).map((x) => x.literal)).toEqual([ + "#ffffff", + "oklch(", + "rgb(", + "hsl(", + ]); + expect(scanColours('const x = "#abc"; const y = `rgba(1,2,3,.5)`; // #123')).toHaveLength(2); + expect(scanColours('\n
')).toEqual([ + { literal: "#abcd", line: 2 }, + ]); + expect( + scanDirectory(fileURLToPath(new URL("./fixtures/token-scanner", import.meta.url))), + ).toHaveLength(4); +}); diff --git a/test/contrast.test.mjs b/test/contrast.test.mjs new file mode 100644 index 000000000..9ca311393 --- /dev/null +++ b/test/contrast.test.mjs @@ -0,0 +1,54 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { expect, test } from "vitest"; +import { + contrast, + contrastIssues, + documentedPairs, + evaluateContrast, + oklchToSrgb, +} from "../scripts/contrast.mjs"; + +test("WCAG reference extremes and neutral inverse conversion", () => { + expect(contrast("oklch(1 0 0)", "oklch(0 0 0)")).toBeCloseTo(21, 5); + expect(contrast("oklch(0.5 0 0)", "oklch(0.5 0 0)")).toBe(1); + expect(oklchToSrgb("oklch(0.5 0 0)").rgb[0]).toBeCloseTo(0.388573, 5); + expect(contrast("oklch(0 0 0 / 50%)", "oklch(1 0 0)")).toBeCloseTo(3.97665, 4); + expect(() => oklchToSrgb("nonsense")).toThrow(); +}); +test("documented pairs cover text, aliases, tiles, links and UI boundaries", () => { + const pairs = documentedPairs({ + "--primary": "", + "--primary-foreground": "x", + "--app-home": "x", + }); + expect(pairs).toContainEqual({ fg: "--primary-foreground", bg: "--primary", minimum: 4.5 }); + expect(pairs.filter((p) => p.fg === "--foreground-muted")).toHaveLength(4); + expect(pairs).toContainEqual({ fg: "--glyph", bg: "--app-home", minimum: 3 }); + expect(pairs).toContainEqual({ fg: "--foreground-subtle", bg: "--surface-3", minimum: 3 }); +}); +test("only an exact documented theme/pair/measurement exempts a failure", () => { + const values = Object.fromEntries( + [ + "background", + "surface", + "surface-2", + "surface-3", + "foreground", + "foreground-muted", + "foreground-subtle", + "primary", + "rail", + "rail-foreground", + "ring", + "border-strong", + ].map((n) => [`--${n}`, "oklch(1 0 0)"]), + ); + const known = contrastIssues(""); + const rows = evaluateContrast({ light: values, dark: values }, known); + expect(rows.filter((r) => r.status === "KNOWN SPEC ISSUE")).toHaveLength(1); + expect(rows.filter((r) => r.status === "FAIL").length).toBeGreaterThan(0); + values["--ring"] = "oklch(0.8 0 0)"; + expect( + evaluateContrast({ light: values }, known).some((r) => r.status === "KNOWN SPEC ISSUE"), + ).toBe(false); +}); diff --git a/test/fixtures/token-scanner/invalid.css b/test/fixtures/token-scanner/invalid.css new file mode 100644 index 000000000..8aca31010 --- /dev/null +++ b/test/fixtures/token-scanner/invalid.css @@ -0,0 +1,10 @@ +/* AUTHORED-BY Codex GPT-6.1-Sol */ +/* #fff is a comment */ +a { + color: #ffffff; + background: oklch(1 0 0); + border-color: rgb(1 2 3); +} +b { + color: hsl(0 0% 0%); +} diff --git a/test/fixtures/token-scanner/valid.tsx b/test/fixtures/token-scanner/valid.tsx new file mode 100644 index 000000000..1b751af2c --- /dev/null +++ b/test/fixtures/token-scanner/valid.tsx @@ -0,0 +1,5 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +// #fff rgb(1 2 3) +/* oklch(1 0 0) */ +export const link = Token fixture; +export const style = { color: "var(--foreground)" }; From 6db5ce5b631529965fd8c7477769e70050e324a9 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 16:28:58 +0000 Subject: [PATCH 05/17] fix: preserve temporal JSON-LD defaults Keep dateTime coercion for date/dateTime unions so existing compact values remain typed. Test all six generated mappings with dateTime strings and explicit date objects. Clarify 1.1.0 release metadata after roborev findings on 354112dd. Co-Authored-By: GPT-6.1-Sol (Codex) --- .../docs/core-context.jsonld | 10 ++++-- .../docs/core.shacl.ttl | 2 +- packages/solid-federation-vocab/docs/core.ttl | 2 +- .../docs/sectors/scheduling-context.jsonld | 20 ++++++++--- .../docs/sectors/scheduling.ttl | 2 +- .../solid-federation-vocab/scripts/build.mjs | 20 ++++++++++- .../scripts/validate.mjs | 34 +++++++++++++++++++ .../sectors/core/core.shacl.ttl | 2 +- .../sectors/core/core.ttl | 2 +- .../sectors/scheduling/scheduling.ttl | 2 +- 10 files changed, 83 insertions(+), 13 deletions(-) diff --git a/packages/solid-federation-vocab/docs/core-context.jsonld b/packages/solid-federation-vocab/docs/core-context.jsonld index 3f6a7005f..4d3242434 100644 --- a/packages/solid-federation-vocab/docs/core-context.jsonld +++ b/packages/solid-federation-vocab/docs/core-context.jsonld @@ -120,8 +120,14 @@ "@id": "core:unit", "@type": "@id" }, - "validFrom": "core:validFrom", - "validUntil": "core:validUntil", + "validFrom": { + "@id": "core:validFrom", + "@type": "xsd:dateTime" + }, + "validUntil": { + "@id": "core:validUntil", + "@type": "xsd:dateTime" + }, "value": "core:value" } } diff --git a/packages/solid-federation-vocab/docs/core.shacl.ttl b/packages/solid-federation-vocab/docs/core.shacl.ttl index 6ac6583c5..844f45059 100644 --- a/packages/solid-federation-vocab/docs/core.shacl.ttl +++ b/packages/solid-federation-vocab/docs/core.shacl.ttl @@ -34,7 +34,7 @@ dcterms:title "Solid Core Ontology — SHACL profile"@en ; owl:versionInfo "1.1.0" ; dcterms:modified "2026-10-25"^^xsd:date ; - rdfs:comment "F4 node shapes for the instantiable gUFO-rebased Core classes. Open by default; MUST=Violation, SHOULD=Warning. v1.0.1: adds core:QuantityShape (numericValue MUST, unit SHOULD)."@en . + rdfs:comment "F4 node shapes for the instantiable gUFO-rebased Core classes. Open by default; MUST=Violation, SHOULD=Warning. v1.1.0 validates optional validity dates as date or dateTime. v1.0.1 added core:QuantityShape (numericValue MUST, unit SHOULD)."@en . # ----------------------------------------------------------------------------- # AGENCY diff --git a/packages/solid-federation-vocab/docs/core.ttl b/packages/solid-federation-vocab/docs/core.ttl index a6a06891d..c82121d92 100644 --- a/packages/solid-federation-vocab/docs/core.ttl +++ b/packages/solid-federation-vocab/docs/core.ttl @@ -64,7 +64,7 @@ now gUFO + this thin profile. External vocabularies are reached via the companion alignments file, never re-derived."""@en ; dcterms:modified "2026-10-25"^^xsd:date ; - rdfs:comment "Re-based per R11 §1.3. v1.0.1 ADDITIVE: adds core:Quantity (a foundational reified quantity value) + core:numericValue/core:unit; no existing term changed."@en . + rdfs:comment "Re-based per R11 §1.3. v1.1.0 widens core:validFrom/core:validUntil to date or dateTime; date values mean all-day. v1.0.1 added core:Quantity + core:numericValue/core:unit."@en . # ----------------------------------------------------------------------------- # Annotation-property declarations (F5: the v0 DL-authoring gap — ROBOT diff --git a/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld b/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld index 395182934..3641e66a4 100644 --- a/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld @@ -44,8 +44,14 @@ "@id": "sched:description", "@type": "xsd:string" }, - "dueTime": "sched:dueTime", - "endTime": "sched:endTime", + "dueTime": { + "@id": "sched:dueTime", + "@type": "xsd:dateTime" + }, + "endTime": { + "@id": "sched:endTime", + "@type": "xsd:dateTime" + }, "eventLocation": { "@id": "sched:eventLocation", "@type": "@id" @@ -86,7 +92,10 @@ "@type": "xsd:dateTime" }, "sector": "sched:sector", - "startTime": "sched:startTime", + "startTime": { + "@id": "sched:startTime", + "@type": "xsd:dateTime" + }, "summary": { "@id": "sched:summary", "@type": "xsd:string" @@ -101,6 +110,9 @@ "@id": "sched:triggerTime", "@type": "xsd:dateTime" }, - "until": "sched:until" + "until": { + "@id": "sched:until", + "@type": "xsd:dateTime" + } } } diff --git a/packages/solid-federation-vocab/docs/sectors/scheduling.ttl b/packages/solid-federation-vocab/docs/sectors/scheduling.ttl index 6ed126935..03822ebb6 100644 --- a/packages/solid-federation-vocab/docs/sectors/scheduling.ttl +++ b/packages/solid-federation-vocab/docs/sectors/scheduling.ttl @@ -68,7 +68,7 @@ a new MAJOR version. Aligns to iCalendar RFC 5545, schema:Event/Schedule and W3C OWL-Time in the companion alignments file."""@en ; dcterms:modified "2026-10-25"^^xsd:date ; - rdfs:comment "Re-based per R11 §4.2."@en . + rdfs:comment "Re-based per R11 §4.2. v1.1.0 allows date or dateTime for entry start/end/due and recurrence until; date values mean all-day. The companion SHACL profile adds schema.org recurrence selectors."@en . # ----------------------------------------------------------------------------- # Annotation-property declarations (F5: keep the merged closure unambiguously diff --git a/packages/solid-federation-vocab/scripts/build.mjs b/packages/solid-federation-vocab/scripts/build.mjs index 46209a1f8..367ee69bb 100644 --- a/packages/solid-federation-vocab/scripts/build.mjs +++ b/packages/solid-federation-vocab/scripts/build.mjs @@ -1,3 +1,4 @@ +// AUTHORED-BY Codex GPT-6.1-Sol // AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate // // Build the served artifacts. The vocabulary source files (*.ttl + *.jsonld) are @@ -21,7 +22,7 @@ import { } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; -import { Parser, Writer } from "n3"; +import { Parser, Store, Writer } from "n3"; const ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); const DIST = join(ROOT, "dist"); @@ -271,6 +272,8 @@ const XSD = "http://www.w3.org/2001/XMLSchema#"; /** Parse an ontology .ttl and index its OWN-namespace terms. */ function indexOntology(ttl, route, ns) { const quads = new Parser({ baseIRI: `https://w3id.org/jeswr/${route}` }).parse(ttl); + const store = new Store(quads); + const lists = store.extractLists(); const byS = new Map(); for (const q of quads) { if (q.subject.termType !== "NamedNode") continue; @@ -282,6 +285,21 @@ function indexOntology(ttl, route, ns) { e.comment = q.object.value; if (q.predicate.value === RDFS_RANGE && q.object.termType === "NamedNode" && !e.range) e.range = q.object.value; + if (q.predicate.value === RDFS_RANGE && q.object.termType === "BlankNode" && !e.range) { + const [head] = store.getObjects(q.object, "http://www.w3.org/2002/07/owl#unionOf", null); + const members = head ? lists[head.value] : undefined; + // Preserve the established compact-JSON-LD dateTime default for the widened + // date|dateTime range. All-day values use explicit @value/@type xsd:date. + if ( + members?.length === 2 && + members.every( + (term) => + term.termType === "NamedNode" && [`${XSD}date`, `${XSD}dateTime`].includes(term.value), + ) + ) { + e.range = `${XSD}dateTime`; + } + } byS.set(q.subject.value, e); } // own-namespace named terms (classes / properties / individuals), not the ontology node diff --git a/packages/solid-federation-vocab/scripts/validate.mjs b/packages/solid-federation-vocab/scripts/validate.mjs index 8e3cf60a2..d50837a89 100644 --- a/packages/solid-federation-vocab/scripts/validate.mjs +++ b/packages/solid-federation-vocab/scripts/validate.mjs @@ -168,6 +168,40 @@ for (const file of ctxFiles) { } } +// The widened OWL range must not turn existing compact dateTime strings into +// xsd:string values. Explicitly typed all-day value objects must still win. +console.log("\nJSON-LD: temporal context compatibility"); +for (const [file, ns, properties] of [ + ["core-context.jsonld", "https://w3id.org/jeswr/core#", ["validFrom", "validUntil"]], + [ + "sectors/scheduling-context.jsonld", + "https://w3id.org/jeswr/sectors/scheduling#", + ["startTime", "endTime", "dueTime", "until"], + ], +]) { + const context = JSON.parse(readFileSync(join(ROOT, "docs", file), "utf8"))["@context"]; + for (const property of properties) { + for (const [value, datatype] of [ + ["2026-11-01T09:00:00Z", "dateTime"], + [{ "@value": "2026-11-01", "@type": "xsd:date" }, "date"], + ]) { + try { + const [expanded] = await jsonld.expand({ + "@context": context, + id: "https://example.org/temporal", + [property]: value, + }); + const actual = expanded?.[`${ns}${property}`]?.[0]?.["@type"]; + if (actual !== `http://www.w3.org/2001/XMLSchema#${datatype}`) + fail(`${file}: ${property} expected xsd:${datatype}, got ${actual}`); + else ok(`${file}: ${property} preserves xsd:${datatype}`); + } catch (err) { + fail(`${file}: ${property} expansion failed: ${err.message}`); + } + } + } +} + // Exercise the actual profiles, including advisory constraints: a wrong datatype // must produce a result even when the profile grades it Warning or Info. console.log("\nSHACL: core validity and scheduling fixtures"); diff --git a/packages/solid-federation-vocab/sectors/core/core.shacl.ttl b/packages/solid-federation-vocab/sectors/core/core.shacl.ttl index 6ac6583c5..844f45059 100644 --- a/packages/solid-federation-vocab/sectors/core/core.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/core/core.shacl.ttl @@ -34,7 +34,7 @@ dcterms:title "Solid Core Ontology — SHACL profile"@en ; owl:versionInfo "1.1.0" ; dcterms:modified "2026-10-25"^^xsd:date ; - rdfs:comment "F4 node shapes for the instantiable gUFO-rebased Core classes. Open by default; MUST=Violation, SHOULD=Warning. v1.0.1: adds core:QuantityShape (numericValue MUST, unit SHOULD)."@en . + rdfs:comment "F4 node shapes for the instantiable gUFO-rebased Core classes. Open by default; MUST=Violation, SHOULD=Warning. v1.1.0 validates optional validity dates as date or dateTime. v1.0.1 added core:QuantityShape (numericValue MUST, unit SHOULD)."@en . # ----------------------------------------------------------------------------- # AGENCY diff --git a/packages/solid-federation-vocab/sectors/core/core.ttl b/packages/solid-federation-vocab/sectors/core/core.ttl index a6a06891d..c82121d92 100644 --- a/packages/solid-federation-vocab/sectors/core/core.ttl +++ b/packages/solid-federation-vocab/sectors/core/core.ttl @@ -64,7 +64,7 @@ now gUFO + this thin profile. External vocabularies are reached via the companion alignments file, never re-derived."""@en ; dcterms:modified "2026-10-25"^^xsd:date ; - rdfs:comment "Re-based per R11 §1.3. v1.0.1 ADDITIVE: adds core:Quantity (a foundational reified quantity value) + core:numericValue/core:unit; no existing term changed."@en . + rdfs:comment "Re-based per R11 §1.3. v1.1.0 widens core:validFrom/core:validUntil to date or dateTime; date values mean all-day. v1.0.1 added core:Quantity + core:numericValue/core:unit."@en . # ----------------------------------------------------------------------------- # Annotation-property declarations (F5: the v0 DL-authoring gap — ROBOT diff --git a/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl b/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl index 6ed126935..03822ebb6 100644 --- a/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl +++ b/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl @@ -68,7 +68,7 @@ a new MAJOR version. Aligns to iCalendar RFC 5545, schema:Event/Schedule and W3C OWL-Time in the companion alignments file."""@en ; dcterms:modified "2026-10-25"^^xsd:date ; - rdfs:comment "Re-based per R11 §4.2."@en . + rdfs:comment "Re-based per R11 §4.2. v1.1.0 allows date or dateTime for entry start/end/due and recurrence until; date values mean all-day. The companion SHACL profile adds schema.org recurrence selectors."@en . # ----------------------------------------------------------------------------- # Annotation-property declarations (F5: keep the merged closure unambiguously From 6234c054c8ba64cb777a5b502f194bb55c512431 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 16:33:03 +0000 Subject: [PATCH 06/17] docs: record sst-2qh validation results Record lane commits, policy-cleared SHACL validation dependency, successful package/affected gates and real F5/HermiT checks. Document the unrelated full-workspace bootstrap restriction and asynchronous review status. Co-Authored-By: GPT-6.1-Sol (Codex) --- STATUS.md | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 STATUS.md diff --git a/STATUS.md b/STATUS.md new file mode 100644 index 000000000..4789312e7 --- /dev/null +++ b/STATUS.md @@ -0,0 +1,111 @@ + + +# sst-2qh / VOC-01 lane report + +Branch: `lane/sst-2qh`. Base: `61048c43eb845a6d244fb90ec9b10ee0b0a7d1f4`. + +## Commits + +- `354112dd` — `feat: support all-day dates and recurrence selectors`: widen the six + OWL ranges; add all-day scope notes, SHACL alternatives and optional schema.org + recurrence selectors; complete scheduling/vCard close matches; bump changed + ontology/profile metadata to 1.1.0, modified 2026-10-25; regenerate docs. +- `936fa2f7` — `test: validate scheduling date and recurrence fixtures`: run 22 + SHACL fixtures through the package validator, including the two acceptance + fixtures, dateTime compatibility, numeric boundaries and invalid value kinds. +- `6db5ce5b` — `fix: preserve temporal JSON-LD defaults`: retain existing dateTime + coercion for union-ranged terms; verify all six generated context mappings with + dateTime strings and explicitly typed date objects; clarify release comments. +- Final `docs: record sst-2qh validation results` commit adds this report. + +## Validation commands and results + +All commands run from this checkout; sector-relative commands are identified below. + +```sh +pnpm --filter @jeswr/solid-federation-vocab run lint && pnpm --filter @jeswr/solid-federation-vocab run build && pnpm --filter @jeswr/solid-federation-vocab run typecheck && pnpm --filter @jeswr/solid-federation-vocab run test +pnpm run lint:root +TURBO_SCM_BASE=61048c43eb845a6d244fb90ec9b10ee0b0a7d1f4 pnpm run gate +``` + +PASS: ordered package checks, root lint, and affected workspace gate (6/6 tasks; +26 root tests). The affected gate was repeated after the compatibility fix and +passed. Package tests include 22 SHACL fixtures and 12 temporal JSON-LD expansion +checks. The ordered package command also passed again on the final code. Docs +were regenerated by the package build (`scripts/build.mjs`); all six changed +Turtle sidecars match their served copies byte-for-byte. `git diff --check` passed. + +```sh +PATH=/opt/homebrew/opt/openjdk/bin:$PATH ROBOT_JAR=/Users/jesght/Documents/GitHub/jeswr/full-solid-ecosystem/federation/engine/tools/robot.jar PSS_ONTOLOGY_REASON=required pnpm --filter @jeswr/solid-federation-vocab run gate +``` + +PASS: final package gate completed after the compatibility fix. This runs +`scripts/lint.mjs`, typecheck, `scripts/validate.mjs`, `scripts/ontology-gate.mjs` +and build. Both complete runs passed all 14 HermiT checks with zero +unsatisfiable classes. HermiT actually executed; no fallback/skip was used. + +The standalone ontology gate also passed with the same Java/ROBOT environment: + +```sh +# cwd: packages/solid-federation-vocab +PATH=/opt/homebrew/opt/openjdk/bin:$PATH ROBOT_JAR=/Users/jesght/Documents/GitHub/jeswr/full-solid-ecosystem/federation/engine/tools/robot.jar PSS_ONTOLOGY_REASON=required node scripts/ontology-gate.mjs +# cwd: packages/solid-federation-vocab/sectors/core +/opt/homebrew/opt/openjdk/bin/java -jar /Users/jesght/Documents/GitHub/jeswr/full-solid-ecosystem/federation/engine/tools/robot.jar validate-profile --profile DL --catalog catalog-v001.xml --input core.ttl --output /tmp/sst-2qh-core-dl.txt +# cwd: packages/solid-federation-vocab/sectors/scheduling +/opt/homebrew/opt/openjdk/bin/java -jar /Users/jesght/Documents/GitHub/jeswr/full-solid-ecosystem/federation/engine/tools/robot.jar validate-profile --profile DL --catalog catalog-v001.xml --input scheduling.ttl --output /tmp/sst-2qh-scheduling-dl.txt +/opt/homebrew/opt/openjdk/bin/java -jar /Users/jesght/Documents/GitHub/jeswr/full-solid-ecosystem/federation/engine/tools/robot.jar merge --catalog catalog-v001.xml --input scheduling.ttl --input ../../test/fixtures/scheduling/all-day-task.ttl reason --reasoner HermiT --output /tmp/sst-2qh-all-day-reasoned.ttl +``` + +PASS: both F5 reports say “Ontology and imports closure in profile.” The additional +HermiT run with the all-day task assertion loaded also exited successfully. + +```sh +pnpm run gate:full +npm_config_cache=/tmp/sst-2qh-npm-cache pnpm run gate:full +``` + +Full workspace gate is **not green**. The first run failed in the untouched +`@jeswr/unstorage-solid#build` (15 successful / 125 tasks) because npm could not +write `/Users/jesght/.npm/_cacache/tmp/…` (`EPERM`). The cache-directed retry was +interrupted after inspection showed that this existing build bootstraps +`@jeswr/fetch-rdf` through a temporary git clone/checkout. Further retries would +conflict with the lane's checkout restriction. Its partial 14/24-task summary is +not a full-gate pass. No unrelated source changes were made to work around this. + +## Dependencies and installation + +```sh +pnpm run check:packages rdf-validate-shacl +pnpm install --lockfile-only --offline --ignore-scripts --frozen-lockfile +``` + +PASS: dependency policy/existence/age check (full npm mode, age 2398 days), and +frozen lockfile validation. `rdf-validate-shacl` 0.6.5 is a dev dependency required +for the brief's real SHACL fixture validation; this exact version and all its +dependencies were already locked elsewhere in the workspace. No lifecycle scripts +were enabled. The only lockfile change is this package's importer entry. + +Initial `pnpm --filter @jeswr/solid-federation-vocab add -D rdf-validate-shacl@0.6.5 --ignore-scripts` +failed with `ERR_PNPM_UNEXPECTED_STORE`. Adding `--lockfile-only` started an +unnecessary workspace resolution and was cancelled; adding `--offline` failed +with `ERR_PNPM_NO_OFFLINE_META`. The manifest/importer were then updated using +the existing locked version, the frozen install above passed, and the already +installed validator was linked locally inside this checkout's ignored node_modules. + +## Review, limitations and questions + +- Roborev job 5772 (`354112dd`) found the context-coercion regression and stale + release comments; both are addressed by `6db5ce5b`. +- Roborev job 5773 (`936fa2f7`) identified that typed Turtle alone missed the + context regression. `6db5ce5b` adds direct expansion tests through both published + contexts for all six date properties, alongside the SHACL datatype fixtures. +- Review job 5775 for `6db5ce5b` was confirmed running, despite enqueue clients + timing out waiting for the daemon response. Its verdict remains pending; + reviews stay asynchronous for dispatcher follow-up. +- No implementation work remains. Full-workspace verification is blocked by the + unrelated build bootstrap described above; tracker changes are left to the + dispatcher because this lane may not touch the canonical tracker checkout. +- Conservative interpretation: generic ContactPoint matches existing vCard channel + properties without new entailments; see [QUESTIONS.md](./QUESTIONS.md). Existing + stronger alignment bridges are preserved. No blocking design question remains. +- Screenshots: none (no UI changes). Namespace rebasing is left for VOC-02. From 59b4a10fac00df3f8fa4db052b35d0d7bde2dc29 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 16:33:44 +0000 Subject: [PATCH 07/17] feat: add suite token fixture host Add the private Next 16 fixture host, token foundation gallery and a six-project Playwright matrix with axe, keyboard, reflow, density and touch checks. Wire the token gates into root lint and register the package and app. Co-Authored-By: GPT-6.1-Sol (Codex) --- apps/suite/.gitignore | 4 + apps/suite/e2e/tokens.spec.ts | 82 ++++++ apps/suite/next.config.ts | 5 + apps/suite/package.json | 34 +++ apps/suite/playwright.config.ts | 29 ++ apps/suite/postcss.config.mjs | 2 + .../src/app/dev/components/fixture-access.ts | 4 + apps/suite/src/app/dev/components/layout.tsx | 7 + apps/suite/src/app/dev/components/page.tsx | 13 + .../src/app/dev/components/tokens/page.tsx | 169 +++++++++++ apps/suite/src/app/globals.css | 262 ++++++++++++++++++ apps/suite/src/app/layout.tsx | 20 ++ apps/suite/src/app/providers.tsx | 20 ++ apps/suite/test/fixture-access.test.ts | 11 + apps/suite/tsconfig.json | 36 +++ apps/suite/vitest.config.ts | 3 + biome.json | 16 +- package.json | 8 +- pnpm-lock.yaml | 84 ++++++ suite.json | 8 +- 20 files changed, 811 insertions(+), 6 deletions(-) create mode 100644 apps/suite/.gitignore create mode 100644 apps/suite/e2e/tokens.spec.ts create mode 100644 apps/suite/next.config.ts create mode 100644 apps/suite/package.json create mode 100644 apps/suite/playwright.config.ts create mode 100644 apps/suite/postcss.config.mjs create mode 100644 apps/suite/src/app/dev/components/fixture-access.ts create mode 100644 apps/suite/src/app/dev/components/layout.tsx create mode 100644 apps/suite/src/app/dev/components/page.tsx create mode 100644 apps/suite/src/app/dev/components/tokens/page.tsx create mode 100644 apps/suite/src/app/globals.css create mode 100644 apps/suite/src/app/layout.tsx create mode 100644 apps/suite/src/app/providers.tsx create mode 100644 apps/suite/test/fixture-access.test.ts create mode 100644 apps/suite/tsconfig.json create mode 100644 apps/suite/vitest.config.ts diff --git a/apps/suite/.gitignore b/apps/suite/.gitignore new file mode 100644 index 000000000..3bea24698 --- /dev/null +++ b/apps/suite/.gitignore @@ -0,0 +1,4 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +.next/ +next-env.d.ts +*.tsbuildinfo diff --git a/apps/suite/e2e/tokens.spec.ts b/apps/suite/e2e/tokens.spec.ts new file mode 100644 index 000000000..865b077c9 --- /dev/null +++ b/apps/suite/e2e/tokens.spec.ts @@ -0,0 +1,82 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { mkdir } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import AxeBuilder from "@axe-core/playwright"; +import { expect, test } from "@playwright/test"; + +for (const route of ["components", "components/tokens"]) { + test(`${route}: accessible fixture and full-page screenshot`, async ({ page }, testInfo) => { + await page.goto(`/dev/${route}`); + const theme = testInfo.project.use.colorScheme; + await expect(page.locator("html")).toHaveAttribute("data-theme", "system"); + await expect(page.locator("html")).toHaveClass(theme === "dark" ? /dark/ : /light/); + await page.evaluate(() => document.fonts.ready); + await expect(page.getByRole("heading", { level: 1 })).toBeVisible(); + const results = await new AxeBuilder({ page }).analyze(); + expect( + results.violations.filter((v) => v.impact === "serious" || v.impact === "critical"), + ).toEqual([]); + const directory = fileURLToPath(new URL("../../../artifacts/screens/DS-01/", import.meta.url)); + await mkdir(directory, { recursive: true }); + await page.screenshot({ + path: `${directory}/${route.replaceAll("/", "-")}-${testInfo.project.name}.png`, + fullPage: true, + }); + await page.setViewportSize({ width: 320, height: 900 }); + expect(await page.evaluate(() => document.documentElement.scrollWidth)).toBeLessThanOrEqual( + 320, + ); + }); +} +test("keyboard navigation, real density heights and reduced motion", async ({ page }) => { + await page.goto("/dev/components"); + await page.keyboard.press("Tab"); + await expect(page.getByRole("link", { name: "Skip to main content" })).toBeFocused(); + await page.keyboard.press("Enter"); + await expect(page.getByRole("main")).toBeFocused(); + await page.keyboard.press("Tab"); + await expect(page.getByRole("link", { name: "Tokens, typography and density" })).toBeFocused(); + await page.keyboard.press("Enter"); + await expect(page.getByRole("heading", { name: "Tokens", exact: true })).toBeVisible(); + expect( + await page + .locator('[data-density="compact"] .density-rows li') + .first() + .evaluate((el) => el.getBoundingClientRect().height), + ).toBe(32); + expect( + await page + .locator('[data-density="comfortable"] .density-rows li') + .first() + .evaluate((el) => el.getBoundingClientRect().height), + ).toBe(44); + expect( + await page + .locator("html") + .evaluate((el) => getComputedStyle(el).getPropertyValue("--duration-base").trim()), + ).toBe("0ms"); +}); + +test("touch pointers force comfortable density and 44px controls", async ({ browser }) => { + const context = await browser.newContext({ + hasTouch: true, + viewport: { width: 375, height: 900 }, + }); + const page = await context.newPage(); + await page.goto("http://127.0.0.1:3210/dev/components/tokens"); + expect(await page.evaluate(() => matchMedia("(pointer: coarse)").matches)).toBe(true); + const compact = page.locator('[data-density="compact"]'); + expect( + await compact + .locator(".density-rows li") + .first() + .evaluate((el) => el.getBoundingClientRect().height), + ).toBe(44); + expect( + await compact.locator("input").evaluate((el) => el.getBoundingClientRect().height), + ).toBeGreaterThanOrEqual(44); + expect( + await compact.locator("button").evaluate((el) => el.getBoundingClientRect().height), + ).toBeGreaterThanOrEqual(44); + await context.close(); +}); diff --git a/apps/suite/next.config.ts b/apps/suite/next.config.ts new file mode 100644 index 000000000..890eaa362 --- /dev/null +++ b/apps/suite/next.config.ts @@ -0,0 +1,5 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import type { NextConfig } from "next"; + +const config: NextConfig = { transpilePackages: ["@jeswr/suite-ui"] }; +export default config; diff --git a/apps/suite/package.json b/apps/suite/package.json new file mode 100644 index 000000000..c0d9cb494 --- /dev/null +++ b/apps/suite/package.json @@ -0,0 +1,34 @@ +{ + "name": "@jeswr/app-suite", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "next dev --webpack -p 3210", + "build": "next build --webpack", + "start": "next start -p 3210", + "lint": "biome check src test e2e *.ts *.mjs", + "typecheck": "tsc --noEmit", + "test": "vitest run", + "test:e2e": "playwright test" + }, + "dependencies": { + "@jeswr/suite-ui": "workspace:*", + "next": "16.2.7", + "next-themes": "^0.4.6", + "react": "19.2.7", + "react-dom": "19.2.7" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "tailwindcss": "^4", + "@playwright/test": "1.61.1", + "@axe-core/playwright": "^4.11.1", + "@types/node": "^25.9.2", + "@types/react": "19.2.17", + "@types/react-dom": "19.2.3", + "typescript": "^6.0.3", + "vitest": "^4.1.9", + "@biomejs/biome": "^2.5.1" + } +} diff --git a/apps/suite/playwright.config.ts b/apps/suite/playwright.config.ts new file mode 100644 index 000000000..6455a1c43 --- /dev/null +++ b/apps/suite/playwright.config.ts @@ -0,0 +1,29 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { defineConfig } from "@playwright/test"; +export default defineConfig({ + testDir: "./e2e", + outputDir: "../../artifacts/playwright/DS-01", + fullyParallel: true, + workers: 2, + forbidOnly: Boolean(process.env.CI), + reporter: "list", + timeout: 60000, + use: { + baseURL: "http://127.0.0.1:3210", + browserName: "chromium", + contextOptions: { reducedMotion: "reduce" }, + trace: "retain-on-failure", + }, + projects: [375, 768, 1280].flatMap((width) => + (["light", "dark"] as const).map((colorScheme) => ({ + name: `${width}-${colorScheme}`, + use: { viewport: { width, height: 900 }, colorScheme }, + })), + ), + webServer: { + command: "pnpm dev --hostname 127.0.0.1", + url: "http://127.0.0.1:3210/dev/components", + reuseExistingServer: !process.env.CI, + timeout: 120000, + }, +}); diff --git a/apps/suite/postcss.config.mjs b/apps/suite/postcss.config.mjs new file mode 100644 index 000000000..979320079 --- /dev/null +++ b/apps/suite/postcss.config.mjs @@ -0,0 +1,2 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +export default { plugins: { "@tailwindcss/postcss": {} } }; diff --git a/apps/suite/src/app/dev/components/fixture-access.ts b/apps/suite/src/app/dev/components/fixture-access.ts new file mode 100644 index 000000000..436dfa6ae --- /dev/null +++ b/apps/suite/src/app/dev/components/fixture-access.ts @@ -0,0 +1,4 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +export function fixturesEnabled(environment: string | undefined, flag: string | undefined) { + return environment !== "production" || flag === "1"; +} diff --git a/apps/suite/src/app/dev/components/layout.tsx b/apps/suite/src/app/dev/components/layout.tsx new file mode 100644 index 000000000..efc96e0a9 --- /dev/null +++ b/apps/suite/src/app/dev/components/layout.tsx @@ -0,0 +1,7 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { notFound } from "next/navigation"; +import { fixturesEnabled } from "./fixture-access"; +export default function FixtureLayout({ children }: { children: React.ReactNode }) { + if (!fixturesEnabled(process.env.NODE_ENV, process.env.NEXT_PUBLIC_DEV_FIXTURES)) notFound(); + return <>{children}; +} diff --git a/apps/suite/src/app/dev/components/page.tsx b/apps/suite/src/app/dev/components/page.tsx new file mode 100644 index 000000000..1899b5c91 --- /dev/null +++ b/apps/suite/src/app/dev/components/page.tsx @@ -0,0 +1,13 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +export default function ComponentsPage() { + return ( +
+

Solid Suite · Design system

+

Component fixtures

+

Tokens and foundations for the suite.

+ +
+ ); +} diff --git a/apps/suite/src/app/dev/components/tokens/page.tsx b/apps/suite/src/app/dev/components/tokens/page.tsx new file mode 100644 index 000000000..e728cae63 --- /dev/null +++ b/apps/suite/src/app/dev/components/tokens/page.tsx @@ -0,0 +1,169 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { type SuiteToken, tokens } from "@jeswr/suite-ui"; +import type { CSSProperties } from "react"; + +const colours = tokens.filter((t) => t.category === "colour"); +const sizes = ["xs", "sm", "base", "md", "lg", "xl", "2xl", "3xl"]; +const style = (properties: Record): CSSProperties => properties as CSSProperties; +function Swatches({ theme }: { theme: "light" | "dark" }) { + return ( +
[token.name, token[theme]])))} + className={`palette ${theme}`} + aria-labelledby={`palette-${theme}`} + > +

{theme === "light" ? "Light" : "Dark"} colours

+
    + {colours.map((token: SuiteToken) => ( +
  • +
  • + ))} +
+
+ ); +} +export default function TokensPage() { + return ( +
+ +
+

Solid Suite · Foundations

+

Tokens

+

Colour, type, space and density. The shared language of the suite.

+
+
+ + +
+
+

Typography

+
+ {sizes.map((size) => ( +

+ {size} Your data stays yours. +

+ ))} +
+
+

Source Serif 4 · A place for your words.

+

Source Code Pro · account.example

+
+
+
+

Spacing

+
    + {tokens + .filter((t) => t.category === "spacing") + .map((t) => ( +
  • + {t.name} +
  • + ))} +
+
+
+

Radius

+
    + {tokens + .filter((t) => t.category === "radius" && t.name !== "--radius") + .map((t) => ( +
  • + {t.name} +

    {t.light}

    +
  • + ))} +
+
+
+

Elevation

+
    + {[0, 1, 2, 3].map((level) => ( +
  • +

    Level {level}

    +

    {["At rest", "Raised card", "Popover", "Dialog"][level]}

    +
  • + ))} +
+
+
+

Density

+
+ {(["comfortable", "compact"] as const).map((density) => ( +
+

{density === "comfortable" ? "Comfortable" : "Compact"}

+
    +
  • + Project notes Today +
  • +
  • + Shared documents Yesterday +
  • +
+ + +

Small control

+ +
Grid card
+
+ ))} +
+
+
+

Motion

+
+ {tokens + .filter((t) => t.category === "motion") + .map((t) => ( +
+
+ {t.name} +
+
{t.light}
+
+ ))} +
+
+
+ ); +} diff --git a/apps/suite/src/app/globals.css b/apps/suite/src/app/globals.css new file mode 100644 index 000000000..b2379a300 --- /dev/null +++ b/apps/suite/src/app/globals.css @@ -0,0 +1,262 @@ +/* AUTHORED-BY Codex GPT-6.1-Sol */ +@import "tailwindcss"; +@import "@jeswr/suite-ui/styles/tokens.css"; +@import "@jeswr/suite-ui/styles/theme.css"; +@import "@jeswr/suite-ui/styles/density.css"; + +* { + box-sizing: border-box; +} +body { + margin: 0; + font-family: var(--font-ui); + font-size: var(--text-base); + line-height: var(--lh-base); + color: var(--foreground); + background: var(--background); + -webkit-font-smoothing: antialiased; +} +:focus-visible { + outline: 2px solid var(--ring); + outline-offset: 2px; + scroll-margin: var(--space-4); +} +a { + color: var(--primary); + display: inline-flex; + align-items: center; + min-height: 24px; +} +.skip-link { + position: absolute; + top: var(--space-2); + left: var(--space-2); + padding: var(--space-2) var(--space-3); + background: var(--surface); + border-radius: var(--radius-md); + z-index: 10; + clip-path: inset(100%); +} +.skip-link:focus { + clip-path: none; +} +h1, +h2, +h3, +p { + margin: 0; +} +h1 { + font-size: var(--text-xl); + line-height: var(--lh-xl); + font-weight: var(--weight-xl); + letter-spacing: var(--tracking-xl); +} +h2 { + font-size: var(--text-lg); + line-height: var(--lh-lg); + font-weight: var(--weight-lg); + margin-bottom: var(--space-4); +} +h3 { + font-size: var(--text-base); + font-weight: 600; +} +code { + font-family: var(--font-mono); + font-size: var(--text-xs); + overflow-wrap: anywhere; +} +ul { + list-style: none; + padding: 0; + margin: 0; +} +.fixture-page { + padding: var(--space-4); + display: grid; + gap: var(--space-8); + min-width: 0; +} +.fixture-heading { + display: grid; + gap: var(--space-2); +} +.eyebrow { + color: var(--foreground-muted); + font-size: var(--text-sm); +} +.palettes { + display: grid; + gap: var(--space-6); +} +.palette { + color: var(--foreground); + background: var(--background); + border: 1px solid var(--border); + border-radius: var(--radius-lg); + padding: var(--space-4); + min-width: 0; + color-scheme: light; +} +.palette.dark { + color-scheme: dark; +} +.swatch-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 144px), 1fr)); + gap: var(--space-4); +} +.swatch-grid li { + display: grid; + align-content: start; + gap: var(--space-1); + min-width: 0; +} +.swatch { + height: var(--space-12); + border-radius: var(--radius-md); + border: 1px solid var(--border); +} +.token-use { + font-size: var(--text-sm); + line-height: var(--lh-sm); + color: var(--foreground-muted); +} +.foundation-card { + padding: var(--space-4); + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius-lg); + min-width: 0; +} +.type-scale { + display: grid; + gap: var(--space-4); + margin-bottom: var(--space-4); +} +.type-scale code { + display: inline-block; + width: var(--space-10); + color: var(--foreground-muted); +} +.document-type { + font-family: var(--font-serif); + font-size: 11pt; + line-height: 1.6; + font-optical-sizing: auto; +} +.mono-type { + font-family: var(--font-mono); + margin-top: var(--space-3); +} +.spacing-list { + display: grid; + gap: var(--space-2); +} +.spacing-list li { + display: flex; + align-items: center; + gap: var(--space-4); + font-variant-numeric: tabular-nums; +} +.spacing-list code { + width: 112px; +} +.spacing-list li > span:first-of-type { + height: var(--space-4); + background: var(--primary); + border-radius: var(--radius-sm); +} +.sample-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); + gap: var(--space-6); +} +.sample-grid p { + margin-top: var(--space-2); +} +.density-rows { + margin-block: var(--space-4); +} +.density-rows li { + min-height: var(--row-h); + padding-inline: var(--cell-px); + font-size: var(--text-row); + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-2); + border-bottom: 1px solid var(--border); +} +.density-rows span { + color: var(--foreground-muted); + font-size: var(--text-xs); +} +.density-label { + display: block; + margin-bottom: var(--space-2); +} +input, +button { + font: inherit; + border: 1px solid var(--border-strong); + border-radius: var(--radius-md); + background: var(--surface); + color: var(--foreground); + padding-inline: var(--cell-px); + min-height: var(--control-h); + max-width: 100%; +} +.small-control { + min-height: var(--control-h-sm); + margin-top: var(--space-2); +} +.density-grid-card { + height: var(--row-h-grid-card); + margin-top: var(--space-4); + border: 1px solid var(--border); + background: var(--surface-2); + border-radius: var(--radius-lg); + padding: var(--cell-px); +} +.motion-list { + margin: 0; + display: grid; + gap: var(--space-3); +} +.motion-list div { + display: flex; + flex-wrap: wrap; + gap: var(--space-2) var(--space-4); +} +.motion-list dd { + margin: 0; + overflow-wrap: anywhere; +} +@media (min-width: 768px) { + .fixture-page { + padding: var(--space-6); + } +} +@media (min-width: 1024px) { + .palettes { + grid-template-columns: 1fr 1fr; + } +} +@media (pointer: coarse) { + a, + button, + input { + min-height: 44px; + } +} +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation: none; + transition: none; + scroll-behavior: auto; + } +} diff --git a/apps/suite/src/app/layout.tsx b/apps/suite/src/app/layout.tsx new file mode 100644 index 000000000..4e5d9ca7d --- /dev/null +++ b/apps/suite/src/app/layout.tsx @@ -0,0 +1,20 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { onest, sourceCode, sourceSerif } from "@jeswr/suite-ui/fonts"; +import type { Metadata } from "next"; +import { Providers } from "./providers"; +import "./globals.css"; +export const metadata: Metadata = { title: "Solid Suite · Component fixtures" }; +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + + + Skip to main content + + {children} + + + + ); +} diff --git a/apps/suite/src/app/providers.tsx b/apps/suite/src/app/providers.tsx new file mode 100644 index 000000000..63086d59f --- /dev/null +++ b/apps/suite/src/app/providers.tsx @@ -0,0 +1,20 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +"use client"; +import { ThemeProvider, useTheme } from "next-themes"; +import { useEffect } from "react"; + +function ThemeAttribute() { + const { theme } = useTheme(); + useEffect(() => { + document.documentElement.dataset.theme = theme ?? "system"; + }, [theme]); + return null; +} +export function Providers({ children }: { children: React.ReactNode }) { + return ( + + + {children} + + ); +} diff --git a/apps/suite/test/fixture-access.test.ts b/apps/suite/test/fixture-access.test.ts new file mode 100644 index 000000000..6a5af49d5 --- /dev/null +++ b/apps/suite/test/fixture-access.test.ts @@ -0,0 +1,11 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { expect, test } from "vitest"; +import { fixturesEnabled } from "../src/app/dev/components/fixture-access"; + +test("fixtures are hidden in production unless explicitly opted in", () => { + expect(fixturesEnabled("production", undefined)).toBe(false); + expect(fixturesEnabled("production", "0")).toBe(false); + expect(fixturesEnabled("production", "1")).toBe(true); + expect(fixturesEnabled("development", undefined)).toBe(true); + expect(fixturesEnabled("test", undefined)).toBe(true); +}); diff --git a/apps/suite/tsconfig.json b/apps/suite/tsconfig.json new file mode 100644 index 000000000..9fcb13c9b --- /dev/null +++ b/apps/suite/tsconfig.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": false, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + }, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +} diff --git a/apps/suite/vitest.config.ts b/apps/suite/vitest.config.ts new file mode 100644 index 000000000..979c659c1 --- /dev/null +++ b/apps/suite/vitest.config.ts @@ -0,0 +1,3 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +import { defineConfig } from "vitest/config"; +export default defineConfig({ test: { environment: "node", include: ["test/**/*.test.ts"] } }); diff --git a/biome.json b/biome.json index dea0fd32e..6ff156e38 100644 --- a/biome.json +++ b/biome.json @@ -23,11 +23,15 @@ "strictCase": false, "conventions": [ { - "selector": { "kind": "objectLiteralProperty" }, + "selector": { + "kind": "objectLiteralProperty" + }, "formats": ["camelCase", "CONSTANT_CASE", "snake_case", "PascalCase"] }, { - "selector": { "kind": "typeProperty" }, + "selector": { + "kind": "typeProperty" + }, "formats": ["camelCase", "CONSTANT_CASE", "snake_case", "PascalCase"] } ] @@ -85,6 +89,14 @@ } } } + }, + { + "includes": ["packages/suite-ui/**/*.css", "apps/suite/**/*.css"], + "css": { + "parser": { + "tailwindDirectives": true + } + } } ] } diff --git a/package.json b/package.json index 1f9737be0..393653776 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@jeswr/solid-sdk-workspace", "private": true, "version": "0.0.0", - "description": "The @jeswr Solid suite workspace — reusable SDK packages and private deployable applications", + "description": "The @jeswr Solid suite workspace \u2014 reusable SDK packages and private deployable applications", "type": "module", "license": "MIT", "author": "Jesse Wright <63333554+jeswr@users.noreply.github.com>", @@ -16,7 +16,7 @@ }, "scripts": { "lint": "pnpm run lint:root && turbo run lint --affected --concurrency=4", - "lint:root": "biome check scripts test guardrails skills package.json turbo.json vitest.config.ts && pnpm run check:lockfile-transport && pnpm run check:app-workspace && pnpm run check:fetch", + "lint:root": "biome check scripts test guardrails skills package.json turbo.json vitest.config.ts && pnpm run check:lockfile-transport && pnpm run check:app-workspace && pnpm run check:fetch && pnpm check:tokens && pnpm check:contrast", "lint:fix": "biome check --write .", "check:lockfile-transport": "node scripts/check-lockfile-transport.mjs", "check:app-workspace": "node scripts/check-app-workspace.mjs", @@ -28,7 +28,9 @@ "build": "turbo run build --affected --concurrency=4", "gate": "pnpm run lint:root && turbo run lint build typecheck test test:root --affected --concurrency=4", "gate:full": "turbo run lint lint:root build typecheck test test:root --concurrency=4", - "mirror-publish": "node scripts/mirror-publish.mjs" + "mirror-publish": "node scripts/mirror-publish.mjs", + "check:tokens": "node scripts/check-tokens.mjs", + "check:contrast": "node scripts/check-contrast.mjs" }, "devDependencies": { "@biomejs/biome": "^2.5.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9ebf77ea..5abc6dc54 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1971,6 +1971,55 @@ importers: specifier: ^4.1.8 version: 4.1.10(@types/node@22.19.21)(@vitest/coverage-v8@4.1.10)(jsdom@26.1.0)(vite@7.3.5(@types/node@22.19.21)(jiti@2.7.0)(lightningcss@1.32.0)) + apps/suite: + dependencies: + '@jeswr/suite-ui': + specifier: workspace:* + version: link:../../packages/suite-ui + next: + specifier: 16.2.7 + version: 16.2.7(@babel/core@7.29.7)(@playwright/test@1.61.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: + specifier: 19.2.7 + version: 19.2.7 + react-dom: + specifier: 19.2.7 + version: 19.2.7(react@19.2.7) + devDependencies: + '@axe-core/playwright': + specifier: ^4.11.1 + version: 4.14.0(playwright-core@1.61.1) + '@biomejs/biome': + specifier: ^2.5.1 + version: 2.5.3 + '@playwright/test': + specifier: 1.61.1 + version: 1.61.1 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.3.2 + '@types/node': + specifier: ^25.9.2 + version: 25.9.5 + '@types/react': + specifier: 19.2.17 + version: 19.2.17 + '@types/react-dom': + specifier: 19.2.3 + version: 19.2.3(@types/react@19.2.17) + tailwindcss: + specifier: ^4 + version: 4.3.1 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vitest: + specifier: ^4.1.9 + version: 4.1.10(@types/node@25.9.5)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)) + packages/agent-authz-verifier: dependencies: '@jeswr/solid-odrl': @@ -3817,6 +3866,24 @@ importers: specifier: ^4.0.0 version: 4.1.10(@types/node@24.13.3)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1)(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) + packages/suite-ui: + devDependencies: + '@biomejs/biome': + specifier: ^2.5.1 + version: 2.5.3 + '@types/node': + specifier: ^25.9.2 + version: 25.9.5 + next: + specifier: 16.2.7 + version: 16.2.7(@babel/core@7.29.7)(@playwright/test@1.61.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vitest: + specifier: ^4.1.9 + version: 4.1.10(@types/node@25.9.5)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)) + packages/synthetic-rdf: dependencies: '@jeswr/rdf-serialize': @@ -4037,6 +4104,12 @@ packages: nodemailer: optional: true + '@axe-core/playwright@4.14.0': + resolution: {integrity: sha512-SGUhG5PIHd2eMdpgBF2PyQLOhX+qyDR2PT4cmoS4Qk2ak+jX/rrSvst9l0PGv5WTHolKpUMvVmoHpr4cZgf1RQ==} + engines: {node: '>=22.12.0'} + peerDependencies: + playwright-core: '>= 1.0.0' + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -9175,6 +9248,10 @@ packages: resolution: {integrity: sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==} engines: {node: '>=4'} + axe-core@4.14.0: + resolution: {integrity: sha512-9WTZxEjsZ7b13TH8JPmbV2z8CHbl80/2hm3XPEG4JgNdQLK81IBRXmSxHfMAOkSqQeRxT/0dwNDz2GOm3zzpcQ==} + engines: {node: '>=4'} + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -13701,6 +13778,11 @@ snapshots: optionalDependencies: nodemailer: 9.0.3 + '@axe-core/playwright@4.14.0(playwright-core@1.61.1)': + dependencies: + axe-core: 4.14.0 + playwright-core: 1.61.1 + '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -21791,6 +21873,8 @@ snapshots: axe-core@4.12.1: {} + axe-core@4.14.0: {} + axobject-query@4.1.0: {} balanced-match@1.0.2: {} diff --git a/suite.json b/suite.json index 6e367d414..48abfd1dd 100644 --- a/suite.json +++ b/suite.json @@ -61,7 +61,8 @@ "@jeswr/solid-vc", "@jeswr/solid-webauthn-reauth", "@jeswr/unstorage-solid", - "@jeswr/y-solid" + "@jeswr/y-solid", + "@jeswr/suite-ui" ], "applications": [ { @@ -128,6 +129,11 @@ "slug": "pod-photos", "name": "@jeswr/app-pod-photos", "kind": "application" + }, + { + "slug": "suite", + "name": "@jeswr/app-suite", + "kind": "application" } ], "dependsOn": [], From 133756b0e954a9e4017a8eca8fe70872a1a15133 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 16:37:32 +0000 Subject: [PATCH 08/17] fix: tighten suite token gate checks Respect file-specific line comment syntax so CSS URLs cannot hide raw colours. Require contrast exceptions to match their recorded three-decimal measurement exactly. Co-Authored-By: GPT-6.1-Sol (Codex) --- scripts/check-tokens.mjs | 14 +++++++++----- scripts/contrast.mjs | 2 +- test/check-tokens.test.mjs | 9 +++++++++ test/contrast.test.mjs | 4 ++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/scripts/check-tokens.mjs b/scripts/check-tokens.mjs index 2b2a80878..637186fad 100644 --- a/scripts/check-tokens.mjs +++ b/scripts/check-tokens.mjs @@ -5,7 +5,8 @@ import { extname, join, resolve } from "node:path"; import { fileURLToPath } from "node:url"; /** Blank comments while retaining offsets/lines and colour literals inside strings. */ -export function withoutComments(source) { +export function withoutComments(source, extension = ".ts") { + const lineComments = /^\.[cm]?[jt]sx?$/.test(extension); let result = ""; let quote = ""; for (let i = 0; i < source.length; ) { @@ -24,7 +25,7 @@ export function withoutComments(source) { ? "*/" : source.startsWith("" - : source.startsWith("//", i) + : lineComments && source.startsWith("//", i) ? "\n" : null; if (!end) { @@ -40,8 +41,8 @@ export function withoutComments(source) { } return result; } -export function scanColours(source) { - const stripped = withoutComments(source); +export function scanColours(source, extension = ".ts") { + const stripped = withoutComments(source, extension); return [ ...stripped.matchAll( /#[\da-f]{8}\b|#[\da-f]{6}\b|#[\da-f]{4}\b|#[\da-f]{3}\b|\b(?:oklch|rgba?|hsla?)\s*\(/gi, @@ -62,7 +63,10 @@ export function scanDirectory(directory) { /\.(?:[cm]?[jt]sx?|css|scss|html|svg|json|mdx)$/.test(extname(path)) ) { failures.push( - ...scanColours(readFileSync(path, "utf8")).map((issue) => ({ path, ...issue })), + ...scanColours(readFileSync(path, "utf8"), extname(path)).map((issue) => ({ + path, + ...issue, + })), ); } } diff --git a/scripts/contrast.mjs b/scripts/contrast.mjs index edd6fee36..aab8e454d 100644 --- a/scripts/contrast.mjs +++ b/scripts/contrast.mjs @@ -79,7 +79,7 @@ export function evaluateContrast(themes, known = new Map()) { status: ratio >= pair.minimum ? "PASS" - : recorded !== undefined && Math.abs(recorded - ratio) < 0.005 + : recorded !== undefined && recorded === Number(ratio.toFixed(3)) ? "KNOWN SPEC ISSUE" : "FAIL", }; diff --git a/test/check-tokens.test.mjs b/test/check-tokens.test.mjs index 899c1eafa..bbe3e9bf9 100644 --- a/test/check-tokens.test.mjs +++ b/test/check-tokens.test.mjs @@ -23,3 +23,12 @@ test("scanner ignores comments, retains literals inside quoted CSS/JS and URLs", scanDirectory(fileURLToPath(new URL("./fixtures/token-scanner", import.meta.url))), ).toHaveLength(4); }); + +test("CSS URLs cannot hide subsequent literals behind false line comments", () => { + expect( + scanColours("a { background: url(https://example.test/image); color: #fff; }", ".css"), + ).toEqual([{ literal: "#fff", line: 1 }]); + expect(scanColours('\n', ".svg")).toEqual([ + { literal: "#fff", line: 2 }, + ]); +}); diff --git a/test/contrast.test.mjs b/test/contrast.test.mjs index 9ca311393..0e2bb92c5 100644 --- a/test/contrast.test.mjs +++ b/test/contrast.test.mjs @@ -46,6 +46,10 @@ test("only an exact documented theme/pair/measurement exempts a failure", () => const known = contrastIssues(""); const rows = evaluateContrast({ light: values, dark: values }, known); expect(rows.filter((r) => r.status === "KNOWN SPEC ISSUE")).toHaveLength(1); + const near = contrastIssues(""); + expect( + evaluateContrast({ light: values }, near).some((r) => r.status === "KNOWN SPEC ISSUE"), + ).toBe(false); expect(rows.filter((r) => r.status === "FAIL").length).toBeGreaterThan(0); values["--ring"] = "oklch(0.8 0 0)"; expect( From 2b85db957053f3737b6f169b8028fc8ae7cc2bd3 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 16:39:39 +0000 Subject: [PATCH 09/17] fix: build fixture dependencies before development Build suite-ui explicitly before the standalone dev server and Playwright command so the ignored CSS and font exports exist on a clean checkout. Co-Authored-By: GPT-6.1-Sol (Codex) --- apps/suite/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/suite/package.json b/apps/suite/package.json index c0d9cb494..d897b68bb 100644 --- a/apps/suite/package.json +++ b/apps/suite/package.json @@ -4,13 +4,13 @@ "private": true, "type": "module", "scripts": { - "dev": "next dev --webpack -p 3210", + "dev": "pnpm --filter @jeswr/suite-ui run build && next dev --webpack -p 3210", "build": "next build --webpack", "start": "next start -p 3210", "lint": "biome check src test e2e *.ts *.mjs", "typecheck": "tsc --noEmit", "test": "vitest run", - "test:e2e": "playwright test" + "test:e2e": "pnpm --filter @jeswr/suite-ui run build && playwright test" }, "dependencies": { "@jeswr/suite-ui": "workspace:*", From 85166462ba83d507b26761065a516e9f6c3e3c1e Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 16:47:48 +0000 Subject: [PATCH 10/17] fix: declare native suite color schemes Emit the color-scheme metadata required by design-system section 10 alongside next-themes dynamic native-control styling. Co-Authored-By: GPT-6.1-Sol (Codex) --- apps/suite/src/app/layout.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/suite/src/app/layout.tsx b/apps/suite/src/app/layout.tsx index 4e5d9ca7d..747fab803 100644 --- a/apps/suite/src/app/layout.tsx +++ b/apps/suite/src/app/layout.tsx @@ -1,8 +1,9 @@ // AUTHORED-BY Codex GPT-6.1-Sol import { onest, sourceCode, sourceSerif } from "@jeswr/suite-ui/fonts"; -import type { Metadata } from "next"; +import type { Metadata, Viewport } from "next"; import { Providers } from "./providers"; import "./globals.css"; +export const viewport: Viewport = { colorScheme: "light dark" }; export const metadata: Metadata = { title: "Solid Suite · Component fixtures" }; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( From 801f866dd1f92ec702e8e74eb9fdb260f066ed52 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 16:50:39 +0000 Subject: [PATCH 11/17] test: check accessibility in every fixture scenario Run axe after keyboard, touch and 320px reflow checks as required by the design system. Retain the active viewport and theme when creating touch contexts. Co-Authored-By: GPT-6.1-Sol (Codex) --- apps/suite/e2e/tokens.spec.ts | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/apps/suite/e2e/tokens.spec.ts b/apps/suite/e2e/tokens.spec.ts index 865b077c9..efcbc38fb 100644 --- a/apps/suite/e2e/tokens.spec.ts +++ b/apps/suite/e2e/tokens.spec.ts @@ -2,7 +2,14 @@ import { mkdir } from "node:fs/promises"; import { fileURLToPath } from "node:url"; import AxeBuilder from "@axe-core/playwright"; -import { expect, test } from "@playwright/test"; +import { expect, type Page, test } from "@playwright/test"; + +async function expectAccessible(page: Page) { + const results = await new AxeBuilder({ page }).analyze(); + expect( + results.violations.filter((v) => v.impact === "serious" || v.impact === "critical"), + ).toEqual([]); +} for (const route of ["components", "components/tokens"]) { test(`${route}: accessible fixture and full-page screenshot`, async ({ page }, testInfo) => { @@ -12,10 +19,7 @@ for (const route of ["components", "components/tokens"]) { await expect(page.locator("html")).toHaveClass(theme === "dark" ? /dark/ : /light/); await page.evaluate(() => document.fonts.ready); await expect(page.getByRole("heading", { level: 1 })).toBeVisible(); - const results = await new AxeBuilder({ page }).analyze(); - expect( - results.violations.filter((v) => v.impact === "serious" || v.impact === "critical"), - ).toEqual([]); + await expectAccessible(page); const directory = fileURLToPath(new URL("../../../artifacts/screens/DS-01/", import.meta.url)); await mkdir(directory, { recursive: true }); await page.screenshot({ @@ -26,6 +30,7 @@ for (const route of ["components", "components/tokens"]) { expect(await page.evaluate(() => document.documentElement.scrollWidth)).toBeLessThanOrEqual( 320, ); + await expectAccessible(page); }); } test("keyboard navigation, real density heights and reduced motion", async ({ page }) => { @@ -55,12 +60,17 @@ test("keyboard navigation, real density heights and reduced motion", async ({ pa .locator("html") .evaluate((el) => getComputedStyle(el).getPropertyValue("--duration-base").trim()), ).toBe("0ms"); + await expectAccessible(page); }); -test("touch pointers force comfortable density and 44px controls", async ({ browser }) => { +test("touch pointers force comfortable density and 44px controls", async ({ + browser, +}, testInfo) => { const context = await browser.newContext({ hasTouch: true, - viewport: { width: 375, height: 900 }, + viewport: testInfo.project.use.viewport ?? { width: 375, height: 900 }, + colorScheme: testInfo.project.use.colorScheme ?? "light", + reducedMotion: "reduce", }); const page = await context.newPage(); await page.goto("http://127.0.0.1:3210/dev/components/tokens"); @@ -78,5 +88,6 @@ test("touch pointers force comfortable density and 44px controls", async ({ brow expect( await compact.locator("button").evaluate((el) => el.getBoundingClientRect().height), ).toBeGreaterThanOrEqual(44); + await expectAccessible(page); await context.close(); }); From 72440f8e51df1ceac848bd94cc122189c4d65150 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 17:11:17 +0000 Subject: [PATCH 12/17] docs: record DS-01 lane validation Record implementation commits, dependency policy checks, package validation, workspace gate failures, blocked browser validation, review decisions and open spec questions. Co-Authored-By: GPT-6.1-Sol (Codex) --- STATUS.md | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 STATUS.md diff --git a/STATUS.md b/STATUS.md new file mode 100644 index 000000000..3c6a0e982 --- /dev/null +++ b/STATUS.md @@ -0,0 +1,87 @@ + +# DS-01 lane report — sst-93m.2 + +Branch: `lane/sst-93m.2`. Base: `61048c43eb845a6d244fb90ec9b10ee0b0a7d1f4`. + +## Changes by commit + +- `f40d9fc4` — `feat: add suite design tokens and fonts`: `@jeswr/suite-ui` 0.1.0, ESM, non-security-critical; 154 typed foundation tokens; normative light/dark CSS; Tailwind/shadcn mapping; comfortable/compact/coarse density; Next font exports; CSS/spec parity and frozen Vitest file snapshot. +- `bbb8435c` — `feat: validate suite token use and contrast`: fixture-tested raw-colour scanner, local OKLCH/sRGB WCAG calculation, 72 contrast pairs, measured exceptions in `QUESTIONS.md`. +- `59b4a10f` — `feat: add suite token fixture host`: private Next 16.2.7 app; theme provider and fonts; dev-only fixture index/gallery; six viewport/theme projects, axe, screenshots, keyboard/reflow/reduced-motion/density/touch scenarios; workspace registration, lockfile and root gate wiring. +- `133756b0` — `fix: tighten suite token gate checks`: file-specific line comments and exact three-decimal known-issue matching, with regressions. +- `2b85db9` — `fix: build fixture dependencies before development`: standalone dev and E2E commands explicitly build suite-ui first. +- `85166462` — `fix: declare native suite color schemes`: explicit light/dark color-scheme metadata, alongside next-themes native-control styling. +- `801f866d` — `test: check accessibility in every fixture scenario`: axe on every scenario/reflow state, with the active theme/viewport retained for touch contexts. + +`app-shell` and other package/app source code were left unchanged. No push, git fetch, branch switch, PR, publishing, dependency lifecycle scripts, or tracker mutation was performed. + +## Dependency policy and installation + +Command: `pnpm run check:packages next next-themes react react-dom @tailwindcss/postcss tailwindcss @playwright/test @axe-core/playwright @types/react @types/react-dom @types/node typescript vitest @biomejs/biome`. + +All 14 packages returned `ok`; policy result: **PASS (full mode, npm)**. Existing locked versions were reused where available; axe is the only new dependency family. No colour dependency was added. + +| Package | Policy result | +|---|---| +| next | PASS | +| next-themes | PASS | +| react | PASS | +| react-dom | PASS | +| @tailwindcss/postcss | PASS | +| tailwindcss | PASS | +| @playwright/test | PASS | +| @axe-core/playwright | PASS | +| @types/react | PASS | +| @types/react-dom | PASS | +| @types/node | PASS | +| typescript | PASS | +| vitest | PASS | +| @biomejs/biome | PASS | + +`CI=true pnpm install --ignore-scripts --no-frozen-lockfile` passed. A readonly copy of the existing home pnpm cache seeded the checkout-local store after the initial module rebuild was slow. Final `CI=true pnpm install --ignore-scripts --offline --frozen-lockfile` passed: lockfile current, already up to date. Only the two new importers and axe-related resolutions were added to the lockfile. + +## Verification + +| Exact command | Result | +|---|---| +| `pnpm --filter @jeswr/suite-ui run lint && pnpm --filter @jeswr/suite-ui run build && pnpm --filter @jeswr/suite-ui run typecheck && pnpm --filter @jeswr/suite-ui run test` | PASS; 3 tests, including the frozen spec snapshot and CSS parity | +| `pnpm --filter @jeswr/app-suite run lint && pnpm --filter @jeswr/app-suite run build && pnpm --filter @jeswr/app-suite run typecheck && pnpm --filter @jeswr/app-suite run test` | PASS; production build and 1 fixture-access test | +| `pnpm test:root` | PASS; 31 tests | +| `pnpm check:tokens` | PASS; 0 raw literals in apps/suite | +| `pnpm check:contrast` | PASS; 72 pairs, 3 exact documented spec exceptions, 0 unlisted failures | +| `pnpm run lint:root` | PASS; includes workspace/transport/fetch and token gates | +| `pnpm --filter @jeswr/app-suite exec playwright test --list` | PASS; 24 scenarios across 375/768/1280 × light/dark | +| `TURBO_SCM_BASE=61048c43eb845a6d244fb90ec9b10ee0b0a7d1f4 pnpm run gate` | FAILED; existing root test timeout under concurrent workspace load (policy-guard/mirror-publish tests); standalone root tests passed | +| `pnpm run gate:full` | FAILED; unchanged unstorage-solid build attempted an npm cache write outside the sandbox (EPERM under ~/.npm/_cacache) | +| `npm_config_cache="$PWD/artifacts/npm-cache" npm_config_ignore_scripts=true TURBO_SCM_BASE=61048c43eb845a6d244fb90ec9b10ee0b0a7d1f4 pnpm run gate` | FAILED; Turbo strict mode filtered the cache override, same unstorage-solid npm cache EPERM | +| `npm_config_cache="$PWD/artifacts/npm-cache" npm_config_ignore_scripts=true pnpm run gate:full --env-mode=loose` | FAILED; 142 successful / 206 scheduled tasks in 15m31.503s; unchanged pod-drive Vitest worker timed out, then coverage thresholds failed (lines 67.28%, functions 73.07%, statements 67.46%, branches 54.16% vs 100%) | +| `npm_config_cache="$PWD/artifacts/npm-cache" npm_config_ignore_scripts=true TURBO_SCM_BASE=61048c43eb845a6d244fb90ec9b10ee0b0a7d1f4 pnpm run gate --env-mode=loose` | FAILED; 252 successful / 277 total, 70 cached, 10m14.124s; unchanged solid-elements test/solid-binding-plugin.test.ts:333 timed out after 5000ms comparing runtime exports. pod-drive passed all 89 tests in this retry. | + +Latest standalone `pnpm --filter @jeswr/app-suite run lint && pnpm --filter @jeswr/app-suite run typecheck && pnpm --filter @jeswr/app-suite run test` passed after the final source commits; the final gate also compiled that source successfully. Updated Playwright test discovery still lists all 24 scenarios. + +Implementation corrections included: the font loader requires `weight: "variable"`, Playwright reduced motion belongs in `contextOptions`, CSS numeric spelling is normalized for semantic parity, and the JSON file snapshot uses UTF-8 rather than escaped Unicode. A transient Next generated-type conflict from running dev and production builds was resolved by removing stale generated dev types after the dev server stopped. + +## Browser and screenshot validation — blocked + +- `node artifacts/capture-references.mjs` attempted all three reference mockups at the six sizes/themes. Installed Chromium 1.61.1 failed to launch: `bootstrap_check_in ... MachPortRendezvousServer ... Permission denied (1100)` / SIGTRAP in this sandbox. +- `pnpm --filter @jeswr/app-suite run test:e2e` failed before scenarios ran: dev server watcher `EMFILE`, then the configured 120s startup timeout. +- `WATCHPACK_POLLING=true pnpm --filter @jeswr/app-suite run test:e2e` also timed out starting the dev server. No browser assertions or axe checks completed. +- Browser-surface discovery exposed no browser automation surface for an alternative visual check. +- **No screenshot PNGs were generated or inspected.** Fixture screenshot/axe acceptance remains unverified. Output is configured for `artifacts/screens/DS-01/`; the reference capture script is in `artifacts/`. `artifacts/` was appended to this checkout's git-dir `info/exclude`; nothing there is committed. +- The fixture is static; no async data surfaces or new shared components were introduced, so async state galleries are outside DS-01. + +## Reviews and scope decisions + +Per-commit roborev jobs were queued asynchronously and read between work rounds. Job 5774's lockfile, Biome, metadata and gate-integration findings were resolved by later lane commits. The mandatory Next peer is retained as explicitly requested by the brief. Job 5776's CSS URL and exception-tolerance findings were fixed in `133756b0`. Its suggested additional colour syntaxes/named colours exceed the dispatcher's specified hex/OKLCH/RGB/HSL grammar and were not added. Job 5780's clean-checkout prerequisite finding was fixed in `2b85db9`; job 5782 reports no issues. Its proposal to include browser tests in normal gates conflicts with the brief's explicit browser-free Turbo gate, so E2E remains separate. Job 5781 notes lightweight scanner limitations around SCSS/MDX comment dialects; this fixture uses TSX/CSS, and no SCSS/MDX parser/dependency was introduced. + +## Open questions / unfinished acceptance + +`QUESTIONS.md` records the normative contrast contradictions: light warning text 4.331:1 (<4.5), light border-strong/background 1.786:1 (<3), dark border-strong/background 2.095:1 (<3). Values are unchanged. It also records the conservative mockup-based naming and touch-target interpretation. Human/spec resolution is required for the contrast claims; the script permits only those exact recorded exceptions. + +Jobs 5783 and 5784 report no issues in the native color-scheme metadata or the expanded per-scenario axe coverage. + +Browser screenshot/axe validation must be rerun in an environment that can launch Chromium and serve the fixtures. The workspace gate remains blocked by the unchanged solid-elements runtime-export timeout; no timeout thresholds or unrelated source were changed. The bead has not been closed; merge/tracker ownership remains with the dispatcher. + +## Final cleanup + +Removed only the 16 gate-generated, previously untracked `callback.html` / `clientid.jsonld` files in the eight legacy pod web public directories. Other package/app source and tracked generated assets are unchanged. Detailed command output is retained locally under `artifacts/validation/DS-01/` (excluded from git). This status file is the last lane commit. From 809d037ddcb562d83179eb7ba102cbf0e7461d3f Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 17:48:08 +0000 Subject: [PATCH 13/17] fix(suite): isolate fixture e2e server per run Co-Authored-By: Claude Opus 5.5 (1M context) --- .gitignore | 3 +++ apps/suite/e2e/tokens.spec.ts | 5 +++-- apps/suite/next.config.ts | 2 +- apps/suite/playwright.config.ts | 15 ++++++++++----- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index ee3fd8152..4b7fba4d1 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ coverage/ *.log .vitest/ .DS_Store + +# Playwright screenshots / traces written by lanes and e2e runs +/artifacts/ diff --git a/apps/suite/e2e/tokens.spec.ts b/apps/suite/e2e/tokens.spec.ts index efcbc38fb..52a68b923 100644 --- a/apps/suite/e2e/tokens.spec.ts +++ b/apps/suite/e2e/tokens.spec.ts @@ -59,7 +59,7 @@ test("keyboard navigation, real density heights and reduced motion", async ({ pa await page .locator("html") .evaluate((el) => getComputedStyle(el).getPropertyValue("--duration-base").trim()), - ).toBe("0ms"); + ).toMatch(/^0m?s$/); // minified builds emit 0s await expectAccessible(page); }); @@ -71,9 +71,10 @@ test("touch pointers force comfortable density and 44px controls", async ({ viewport: testInfo.project.use.viewport ?? { width: 375, height: 900 }, colorScheme: testInfo.project.use.colorScheme ?? "light", reducedMotion: "reduce", + baseURL: testInfo.project.use.baseURL, }); const page = await context.newPage(); - await page.goto("http://127.0.0.1:3210/dev/components/tokens"); + await page.goto("/dev/components/tokens"); expect(await page.evaluate(() => matchMedia("(pointer: coarse)").matches)).toBe(true); const compact = page.locator('[data-density="compact"]'); expect( diff --git a/apps/suite/next.config.ts b/apps/suite/next.config.ts index 890eaa362..7756888db 100644 --- a/apps/suite/next.config.ts +++ b/apps/suite/next.config.ts @@ -1,5 +1,5 @@ // AUTHORED-BY Codex GPT-6.1-Sol import type { NextConfig } from "next"; -const config: NextConfig = { transpilePackages: ["@jeswr/suite-ui"] }; +const config: NextConfig = { transpilePackages: ["@jeswr/suite-ui"], devIndicators: false }; export default config; diff --git a/apps/suite/playwright.config.ts b/apps/suite/playwright.config.ts index 6455a1c43..e51351c6c 100644 --- a/apps/suite/playwright.config.ts +++ b/apps/suite/playwright.config.ts @@ -1,5 +1,8 @@ // AUTHORED-BY Codex GPT-6.1-Sol import { defineConfig } from "@playwright/test"; + +// Each lane checkout sets its own SUITE_E2E_PORT so parallel runs never share a server. +const port = Number(process.env.SUITE_E2E_PORT ?? 3210); export default defineConfig({ testDir: "./e2e", outputDir: "../../artifacts/playwright/DS-01", @@ -9,7 +12,7 @@ export default defineConfig({ reporter: "list", timeout: 60000, use: { - baseURL: "http://127.0.0.1:3210", + baseURL: `http://127.0.0.1:${port}`, browserName: "chromium", contextOptions: { reducedMotion: "reduce" }, trace: "retain-on-failure", @@ -21,9 +24,11 @@ export default defineConfig({ })), ), webServer: { - command: "pnpm dev --hostname 127.0.0.1", - url: "http://127.0.0.1:3210/dev/components", - reuseExistingServer: !process.env.CI, - timeout: 120000, + // A production build is deterministic (no on-demand dev compiles timing out tests). + command: `next build --webpack && next start --hostname 127.0.0.1 -p ${port}`, + env: { NEXT_PUBLIC_DEV_FIXTURES: "1" }, + url: `http://127.0.0.1:${port}/dev/components`, + reuseExistingServer: false, + timeout: 300000, }, }); From 384a8fc2e9a76b8df73fac523a4d6fd18c14fb5e Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 21:57:51 +0000 Subject: [PATCH 14/17] feat(vocab): generate legacy namespace alignments Co-Authored-By: GPT-6.1-Sol (Codex) --- QUESTIONS.md | 23 + .../legacy-w3id-alignments.ttl | 783 ++++++++++++++++++ .../solid-federation-vocab/scripts/build.mjs | 6 +- .../scripts/legacy-w3id-alignments.mjs | 88 ++ .../solid-federation-vocab/scripts/lint.mjs | 2 +- .../scripts/validate.mjs | 4 +- 6 files changed, 902 insertions(+), 4 deletions(-) create mode 100644 QUESTIONS.md create mode 100644 packages/solid-federation-vocab/legacy-w3id-alignments.ttl create mode 100644 packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs diff --git a/QUESTIONS.md b/QUESTIONS.md new file mode 100644 index 000000000..d099c6375 --- /dev/null +++ b/QUESTIONS.md @@ -0,0 +1,23 @@ + + +# sst-xex interpretation record + +1. **Portfolio draft PR versus lane isolation** — VOC-02 acceptance asks for a + portfolio draft PR, while the lane rules forbid PRs and changes outside this + checkout. Options: modify portfolio/open a PR, or verify the existing registry + read-only and leave the PR/deploy to the lead. Take the latter: no registry + edits are needed if its existing representation URLs work; commit the check + script and results here. No production deployment is authorized. + +2. **Version scope** — VOC-02 says “every ontology” and explicitly lists the main + core/sector/task/fed/fedreg ontologies. Options: bump only those main documents, + or also bump suite-owned `owl:Ontology` sidecars and curated import modules. + Take the literal reading: all rebased suite-owned ontology nodes become 2.0.0 + with version IRIs and an explanatory description. Third-party ontology + identities and existing `prof:Profile` version histories are preserved. + +3. **“fedcon: untouched” versus references to moved namespaces** — DECISIONS V1 + preserves `https://jeswr.org/fedcon#`, while VOC-02 requires removing active + legacy bases from the whole package. Options: freeze all fedcon files, or + preserve its terms, ontology identity and version while updating its fedreg + references. Take the latter so composed contexts and shapes keep working. diff --git a/packages/solid-federation-vocab/legacy-w3id-alignments.ttl b/packages/solid-federation-vocab/legacy-w3id-alignments.ttl new file mode 100644 index 000000000..0419a3148 --- /dev/null +++ b/packages/solid-federation-vocab/legacy-w3id-alignments.ttl @@ -0,0 +1,783 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +# Generated by scripts/legacy-w3id-alignments.mjs from git 6b46636d065fd49f4a07d86c92cacad8ef4bea96. +# Mode-A compatibility sidecar: opt-in only; NEVER owl:import this file. +# OWL equivalences have entailments when explicitly loaded. This sidecar is +# excluded from dist/vocab.nt and every ontology's reasoned import closure. +# Exactly one old-to-new mapping per declared term; external terms are omitted. + +@prefix owl: . + + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentClass . + owl:equivalentClass . + owl:sameAs . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:sameAs . + owl:sameAs . + owl:equivalentProperty . + owl:equivalentClass . + owl:equivalentProperty . + owl:equivalentProperty . diff --git a/packages/solid-federation-vocab/scripts/build.mjs b/packages/solid-federation-vocab/scripts/build.mjs index 367ee69bb..14d6de886 100644 --- a/packages/solid-federation-vocab/scripts/build.mjs +++ b/packages/solid-federation-vocab/scripts/build.mjs @@ -34,7 +34,11 @@ mkdirSync(DOCS, { recursive: true }); // fedcon.shacl.ttl): like the sector .shacl.ttl profiles they are copied VERBATIM // as sidecars (below), never merged into the reasoned vocab.nt dump nor given their // own HTML/context — mirroring the sectors/ convention. -const ttlFiles = readdirSync(ROOT).filter((f) => f.endsWith(".ttl") && !f.endsWith(".shacl.ttl")); +const ttlFiles = readdirSync(ROOT).filter( + (f) => f.endsWith(".ttl") && !f.endsWith(".shacl.ttl") && f !== "legacy-w3id-alignments.ttl", +); +// Mode-A compatibility is served for opt-in readers, never added to vocab.nt. +copyFileSync(join(ROOT, "legacy-w3id-alignments.ttl"), join(DOCS, "legacy-w3id-alignments.ttl")); const jsonldFiles = readdirSync(ROOT).filter((f) => f.endsWith(".jsonld")); // 1 + 2 — parse all Turtle, re-serialise via n3.Writer. diff --git a/packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs b/packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs new file mode 100644 index 000000000..cdd5a34a8 --- /dev/null +++ b/packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs @@ -0,0 +1,88 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +// Generate the compatibility sidecar from the immutable pre-VOC-02 sources. +// Historical namespace: https://w3id.org/jeswr/ (never imported by the ontologies). +// Run from any directory; optionally pass a different pre-rebase git revision. + +import { execFileSync } from "node:child_process"; +import { writeFileSync } from "node:fs"; +import { basename, dirname, join, relative } from "node:path"; +import { fileURLToPath } from "node:url"; +import { DataFactory, Parser, Writer } from "n3"; + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); +const WORKSPACE = join(ROOT, "..", ".."); +const sourceRef = process.argv[2] ?? "6b46636d065fd49f4a07d86c92cacad8ef4bea96"; +const oldRoot = new URL("/jeswr/", "https://w3id.org").href; +const newRoot = "https://jeswr.org/ns/"; +const RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; +const RDFS = "http://www.w3.org/2000/01/rdf-schema#"; +const OWL = "http://www.w3.org/2002/07/owl#"; +const { namedNode, quad } = DataFactory; +const git = (...args) => execFileSync("git", args, { cwd: WORKSPACE, encoding: "utf8" }); +const packagePath = relative(WORKSPACE, ROOT); +const files = git("ls-tree", "-r", "--name-only", sourceRef, "--", packagePath) + .trim() + .split("\n") + .filter((path) => { + const rel = relative(packagePath, path); + return ( + ["fedapp.ttl", "fedreg.ttl", "task.ttl"].includes(rel) || + (rel.startsWith("sectors/") && basename(path) === `${basename(dirname(path))}.ttl`) + ); + }); +if (files.length !== 17) + throw new Error(`Expected 17 pre-rebase vocabularies, got ${files.length}`); + +const terms = new Map(); +for (const file of files) { + const quads = new Parser().parse(git("show", `${sourceRef}:${file}`)); + const ontology = quads.find( + (q) => q.predicate.value === `${RDF}type` && q.object.value === `${OWL}Ontology`, + )?.subject.value; + if (!ontology?.startsWith(oldRoot)) throw new Error(`${file}: not a legacy ontology`); + for (const q of quads) { + if (q.subject.termType !== "NamedNode" || !q.subject.value.startsWith(`${ontology}#`)) continue; + const types = terms.get(q.subject.value) ?? new Set(); + if (q.predicate.value === `${RDF}type`) types.add(q.object.value); + terms.set(q.subject.value, types); + } +} + +const writer = new Writer({ prefixes: { owl: OWL } }); +const counts = { equivalentClass: 0, equivalentProperty: 0, sameAs: 0 }; +for (const [iri, types] of [...terms].sort(([a], [b]) => a.localeCompare(b))) { + if (types.size === 0) throw new Error(`${iri}: no declared type; cannot classify legacy term`); + const relation = + types.has(`${OWL}Class`) || types.has(`${RDFS}Class`) + ? "equivalentClass" + : [ + `${RDF}Property`, + `${OWL}ObjectProperty`, + `${OWL}DatatypeProperty`, + `${OWL}AnnotationProperty`, + ].some((type) => types.has(type)) + ? "equivalentProperty" + : "sameAs"; + writer.addQuad( + quad( + namedNode(iri), + namedNode(`${OWL}${relation}`), + namedNode(newRoot + iri.slice(oldRoot.length)), + ), + ); + counts[relation] += 1; +} +const turtle = await new Promise((resolve, reject) => { + writer.end((error, result) => (error ? reject(error) : resolve(result))); +}); +const header = `# AUTHORED-BY Codex GPT-6.1-Sol +# Generated by scripts/legacy-w3id-alignments.mjs from git ${sourceRef}. +# Mode-A compatibility sidecar: opt-in only; NEVER owl:import this file. +# OWL equivalences have entailments when explicitly loaded. This sidecar is +# excluded from dist/vocab.nt and every ontology's reasoned import closure. +# Exactly one old-to-new mapping per declared term; external terms are omitted. +\n`; +writeFileSync(join(ROOT, "legacy-w3id-alignments.ttl"), header + turtle); +console.log( + `Legacy mappings: ${terms.size} terms from ${files.length} ontologies (${JSON.stringify(counts)})`, +); diff --git a/packages/solid-federation-vocab/scripts/lint.mjs b/packages/solid-federation-vocab/scripts/lint.mjs index 3e57e3681..333204cb2 100644 --- a/packages/solid-federation-vocab/scripts/lint.mjs +++ b/packages/solid-federation-vocab/scripts/lint.mjs @@ -14,7 +14,7 @@ const WORKSPACE_ROOT = join(ROOT, "..", ".."); // model that actually authored a file — older files carry "Claude Opus 4.8", newer // ones "Claude Sonnet 5", etc.). Still requires a concrete model token after the // name, so a genuinely missing marker is caught. -const MARKER = /AUTHORED-BY Claude \S+/; +const MARKER = /AUTHORED-BY (?:Claude|Codex) \S+/; let failures = 0; const fail = (m) => { diff --git a/packages/solid-federation-vocab/scripts/validate.mjs b/packages/solid-federation-vocab/scripts/validate.mjs index d50837a89..0763db263 100644 --- a/packages/solid-federation-vocab/scripts/validate.mjs +++ b/packages/solid-federation-vocab/scripts/validate.mjs @@ -51,8 +51,8 @@ for (const file of ttlFiles) { // carry only rdfs:label, exactly like the sector .shacl.ttl sidecars, which this // gate never term-checks. Skip the label/comment/isDefinedBy + ontology-node // loop for them (mirrors the sectors/ convention). - if (file.endsWith(".shacl.ttl")) { - ok("SHACL profile — not term-hygiene-checked (mirrors the sectors/ convention)"); + if (file.endsWith(".shacl.ttl") || file === "legacy-w3id-alignments.ttl") { + ok("Profile or Mode-A sidecar — parsed without ontology term-hygiene checks"); continue; } From 28cbe3f1ce1422cb94be9e3f2491cfe72d4133be Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 22:03:35 +0000 Subject: [PATCH 15/17] feat(vocab): rebase ontologies to jeswr.org Rebase the source graphs, profiles, catalogs, contexts, examples and documentation. Version suite-owned ontology nodes at 2.0.0, preserve fedcon identity and add migration regression checks. Verify all 51 representation URLs in the existing portfolio registry without changing its legacy predecessor fields. Co-Authored-By: GPT-6.1-Sol (Codex) --- packages/solid-federation-vocab/README.md | 46 +- .../solid-federation-vocab/context.jsonld | 4 +- .../docs/context.jsonld | 4 +- .../docs/core-alignments.ttl | 10 +- .../docs/core-context.jsonld | 2 +- .../solid-federation-vocab/docs/core.html | 4 +- .../docs/core.shacl.ttl | 8 +- packages/solid-federation-vocab/docs/core.ttl | 12 +- packages/solid-federation-vocab/docs/fed.html | 6 +- packages/solid-federation-vocab/docs/fed.ttl | 35 +- .../solid-federation-vocab/docs/fedapp.ttl | 35 +- .../docs/fedcon-context.jsonld | 2 +- .../docs/fedcon.shacl.ttl | 4 +- .../solid-federation-vocab/docs/fedcon.ttl | 20 +- .../docs/fedreg-context.jsonld | 4 +- .../solid-federation-vocab/docs/fedreg.html | 6 +- .../solid-federation-vocab/docs/fedreg.ttl | 55 +- .../solid-federation-vocab/docs/index.html | 41 +- .../docs/legacy-w3id-alignments.ttl | 783 ++++++++++++++++++ .../docs/sectors/bookmarks-alignments.ttl | 13 +- .../docs/sectors/bookmarks-context.jsonld | 2 +- .../docs/sectors/bookmarks.html | 4 +- .../docs/sectors/bookmarks.shacl.ttl | 16 +- .../docs/sectors/bookmarks.ttl | 26 +- .../docs/sectors/collectibles-alignments.ttl | 12 +- .../docs/sectors/collectibles-context.jsonld | 2 +- .../docs/sectors/collectibles.html | 4 +- .../docs/sectors/collectibles.shacl.ttl | 20 +- .../docs/sectors/collectibles.ttl | 22 +- .../docs/sectors/contacts-alignments.ttl | 13 +- .../docs/sectors/contacts-context.jsonld | 2 +- .../docs/sectors/contacts.html | 4 +- .../docs/sectors/contacts.shacl.ttl | 16 +- .../docs/sectors/contacts.ttl | 24 +- .../docs/sectors/drawing-alignments.ttl | 13 +- .../docs/sectors/drawing-context.jsonld | 2 +- .../docs/sectors/drawing.html | 4 +- .../docs/sectors/drawing.shacl.ttl | 16 +- .../docs/sectors/drawing.ttl | 26 +- .../docs/sectors/equine-alignments.ttl | 12 +- .../docs/sectors/equine-context.jsonld | 2 +- .../docs/sectors/equine.html | 4 +- .../docs/sectors/equine.shacl.ttl | 20 +- .../docs/sectors/equine.ttl | 24 +- .../docs/sectors/finance-alignments.ttl | 11 +- .../docs/sectors/finance-context.jsonld | 2 +- .../docs/sectors/finance.html | 4 +- .../docs/sectors/finance.shacl.ttl | 32 +- .../docs/sectors/finance.ttl | 26 +- .../docs/sectors/futures-alignments.ttl | 16 +- .../docs/sectors/futures-context.jsonld | 2 +- .../docs/sectors/futures.html | 4 +- .../docs/sectors/futures.shacl.ttl | 36 +- .../docs/sectors/futures.ttl | 24 +- .../docs/sectors/health-alignments.ttl | 12 +- .../docs/sectors/health-context.jsonld | 2 +- .../docs/sectors/health.html | 4 +- .../docs/sectors/health.shacl.ttl | 20 +- .../docs/sectors/health.ttl | 26 +- .../docs/sectors/health/diet-alignments.ttl | 14 +- .../docs/sectors/health/diet-context.jsonld | 2 +- .../docs/sectors/health/diet.html | 4 +- .../docs/sectors/health/diet.shacl.ttl | 22 +- .../docs/sectors/health/diet.ttl | 28 +- .../docs/sectors/identity-alignments.ttl | 13 +- .../docs/sectors/identity.html | 4 +- .../docs/sectors/identity.shacl.ttl | 16 +- .../docs/sectors/identity.ttl | 24 +- .../docs/sectors/media-alignments.ttl | 13 +- .../docs/sectors/media-context.jsonld | 2 +- .../docs/sectors/media.html | 4 +- .../docs/sectors/media.shacl.ttl | 16 +- .../docs/sectors/media.ttl | 26 +- .../docs/sectors/scheduling-alignments.ttl | 13 +- .../docs/sectors/scheduling-context.jsonld | 2 +- .../docs/sectors/scheduling.html | 4 +- .../docs/sectors/scheduling.shacl.ttl | 16 +- .../docs/sectors/scheduling.ttl | 22 +- .../docs/sectors/social-alignments.ttl | 11 +- .../docs/sectors/social-context.jsonld | 2 +- .../docs/sectors/social.html | 4 +- .../docs/sectors/social.shacl.ttl | 16 +- .../docs/sectors/social.ttl | 26 +- .../docs/task-context.jsonld | 2 +- .../solid-federation-vocab/docs/task.html | 4 +- packages/solid-federation-vocab/docs/task.ttl | 57 +- packages/solid-federation-vocab/fedapp.ttl | 35 +- .../fedcon-context.jsonld | 2 +- .../solid-federation-vocab/fedcon.shacl.ttl | 4 +- packages/solid-federation-vocab/fedcon.ttl | 20 +- .../fedreg-context.jsonld | 4 +- packages/solid-federation-vocab/fedreg.ttl | 55 +- packages/solid-federation-vocab/package.json | 8 +- .../solid-federation-vocab/scripts/build.mjs | 66 +- .../scripts/example.mjs | 6 +- .../scripts/import-sectors.mjs | 20 +- .../scripts/legacy-w3id-alignments.mjs | 36 +- .../scripts/ontology-gate.mjs | 40 +- .../scripts/test-rebase.mjs | 183 ++++ .../scripts/validate.mjs | 10 +- .../scripts/verify-persistent-ids.mjs | 74 ++ .../bookmarks/bookmarks-alignments.ttl | 13 +- .../sectors/bookmarks/bookmarks.shacl.ttl | 16 +- .../sectors/bookmarks/bookmarks.ttl | 26 +- .../sectors/bookmarks/catalog-v001.xml | 12 +- .../sectors/collectibles/catalog-v001.xml | 12 +- .../collectibles/collectibles-alignments.ttl | 12 +- .../collectibles/collectibles-examples.ttl | 4 +- .../collectibles/collectibles.shacl.ttl | 20 +- .../sectors/collectibles/collectibles.ttl | 22 +- .../sectors/contacts/catalog-v001.xml | 12 +- .../sectors/contacts/contacts-alignments.ttl | 13 +- .../sectors/contacts/contacts.shacl.ttl | 16 +- .../sectors/contacts/contacts.ttl | 24 +- .../sectors/core/catalog-v001.xml | 6 +- .../sectors/core/core-alignments.ttl | 10 +- .../sectors/core/core.shacl.ttl | 8 +- .../sectors/core/core.ttl | 12 +- .../sectors/drawing/catalog-v001.xml | 12 +- .../sectors/drawing/drawing-alignments.ttl | 13 +- .../sectors/drawing/drawing.shacl.ttl | 16 +- .../sectors/drawing/drawing.ttl | 26 +- .../sectors/equine/catalog-v001.xml | 12 +- .../sectors/equine/equine-alignments.ttl | 12 +- .../sectors/equine/equine-examples.ttl | 4 +- .../sectors/equine/equine.shacl.ttl | 20 +- .../sectors/equine/equine.ttl | 24 +- .../sectors/finance/catalog-v001.xml | 16 +- .../sectors/finance/finance-alignments.ttl | 11 +- .../sectors/finance/finance-examples.ttl | 4 +- .../sectors/finance/finance.shacl.ttl | 32 +- .../sectors/finance/finance.ttl | 26 +- .../sectors/finance/imports/fibo-slim.ttl | 9 +- .../sectors/futures/catalog-v001.xml | 13 +- .../sectors/futures/futures-alignments.ttl | 16 +- .../sectors/futures/futures-examples.ttl | 10 +- .../sectors/futures/futures.shacl.ttl | 36 +- .../sectors/futures/futures.ttl | 24 +- .../sectors/health/catalog-v001.xml | 14 +- .../sectors/health/diet/catalog-v001.xml | 20 +- .../sectors/health/diet/diet-alignments.ttl | 14 +- .../sectors/health/diet/diet-examples.ttl | 6 +- .../health/diet/diet-negative-examples.ttl | 2 +- .../sectors/health/diet/diet.shacl.ttl | 22 +- .../sectors/health/diet/diet.ttl | 28 +- .../sectors/health/health-alignments.ttl | 12 +- .../sectors/health/health.shacl.ttl | 20 +- .../sectors/health/health.ttl | 26 +- .../health/imports/qudt-health-slim.ttl | 9 +- .../sectors/identity/catalog-v001.xml | 12 +- .../sectors/identity/identity-alignments.ttl | 13 +- .../sectors/identity/identity.shacl.ttl | 16 +- .../sectors/identity/identity.ttl | 24 +- .../sectors/media/catalog-v001.xml | 12 +- .../sectors/media/media-alignments.ttl | 13 +- .../sectors/media/media.shacl.ttl | 16 +- .../sectors/media/media.ttl | 26 +- .../sectors/scheduling/catalog-v001.xml | 12 +- .../scheduling/scheduling-alignments.ttl | 13 +- .../sectors/scheduling/scheduling.shacl.ttl | 16 +- .../sectors/scheduling/scheduling.ttl | 22 +- .../sectors/social/catalog-v001.xml | 12 +- .../sectors/social/social-alignments.ttl | 11 +- .../sectors/social/social.shacl.ttl | 16 +- .../sectors/social/social.ttl | 26 +- .../task-context.jsonld | 2 +- packages/solid-federation-vocab/task.ttl | 57 +- .../fixtures/scheduling/all-day-event.ttl | 4 +- .../test/fixtures/scheduling/all-day-task.ttl | 4 +- .../scheduling/by-day-blank.invalid.ttl | 4 +- .../fixtures/scheduling/by-day.invalid.ttl | 4 +- .../fixtures/scheduling/byMonth-0.invalid.ttl | 4 +- .../fixtures/scheduling/byMonth-1.invalid.ttl | 4 +- .../fixtures/scheduling/byMonth-2.invalid.ttl | 4 +- .../scheduling/byMonthDay-0.invalid.ttl | 4 +- .../scheduling/byMonthDay-1.invalid.ttl | 4 +- .../scheduling/byMonthDay-2.invalid.ttl | 4 +- .../scheduling/byMonthDay-3.invalid.ttl | 4 +- .../scheduling/byMonthDay-4.invalid.ttl | 4 +- .../test/fixtures/scheduling/datetime.ttl | 4 +- .../fixtures/scheduling/due-time.invalid.ttl | 4 +- .../fixtures/scheduling/end-time.invalid.ttl | 4 +- .../scheduling/except-date.invalid.ttl | 4 +- .../fixtures/scheduling/recurrence-monday.ttl | 4 +- .../scheduling/recurrence-selectors.ttl | 4 +- .../scheduling/start-time.invalid.ttl | 4 +- .../fixtures/scheduling/until.invalid.ttl | 4 +- .../scheduling/valid-from.invalid.ttl | 4 +- .../scheduling/valid-until.invalid.ttl | 4 +- .../verification/persistent-ids.tsv | 56 ++ 190 files changed, 2479 insertions(+), 1266 deletions(-) create mode 100644 packages/solid-federation-vocab/docs/legacy-w3id-alignments.ttl create mode 100644 packages/solid-federation-vocab/scripts/test-rebase.mjs create mode 100644 packages/solid-federation-vocab/scripts/verify-persistent-ids.mjs create mode 100644 packages/solid-federation-vocab/verification/persistent-ids.tsv diff --git a/packages/solid-federation-vocab/README.md b/packages/solid-federation-vocab/README.md index 588461d97..30ccf6c62 100644 --- a/packages/solid-federation-vocab/README.md +++ b/packages/solid-federation-vocab/README.md @@ -29,11 +29,11 @@ Add federation metadata to a Solid Client Identifier Document: { "@context": [ "https://www.w3.org/ns/solid/oidc-context.jsonld", - "https://w3id.org/jeswr/fed" + "https://jeswr.org/ns/fed" ], "client_id": "https://app.example/clientid.jsonld", "type": "App", - "sector": "https://w3id.org/jeswr/sectors/scheduling#sector", + "sector": "https://jeswr.org/ns/sectors/scheduling#sector", "access": ["Read", "Write"] } ``` @@ -45,12 +45,50 @@ Add federation metadata to a Solid Client Identifier Document: - `sectors/core/` and the other `sectors/*/` directories: gUFO-rooted core and sector ontologies. - `*-context.jsonld`: JSON-LD contexts; `*.shacl.ttl`: validation profiles. - `docs/`: generated Turtle, JSON-LD, and HTML served through the persistent namespaces. +- `legacy-w3id-alignments.ttl`: optional old-to-new mappings for all 774 pre-rebase + terms (220 classes, 304 properties, 250 individuals), generated from the + pre-VOC-02 git revision. This Mode-A compatibility sidecar has OWL entailments + when explicitly loaded; it is never imported or included in `dist/vocab.nt`. + +## Namespace migration (2.0.0) + +DECISIONS V1 moves core, task, fed, fedreg and every sector to +`https://jeswr.org/ns/#`, with version IRIs at +`https://jeswr.org/ns//2.0.0`. The existing `fedcon:` namespace remains +`https://jeswr.org/fedcon#`; references from its context and shapes use the new +`fedreg:` namespace. Existing profile version histories retain their version +numbers under the new base. Representation filenames are unchanged. + +Regenerate the legacy mappings from the immutable pre-change sources, then +rebuild and check the vocabularies: + +```sh +pnpm --filter @jeswr/solid-federation-vocab exec node scripts/legacy-w3id-alignments.mjs +pnpm --filter @jeswr/solid-federation-vocab run gate +``` + +The generator reads git revision `6b46636d065fd49f4a07d86c92cacad8ef4bea96` by +default; that revision must be available locally (use full history when +regenerating). It accepts an optional pre-rebase revision as its first argument. +Normal builds use the committed mappings and do not need historical git objects. + +Verify all registered representation URLs against the read-only portfolio +registry (or pass an unmodified local `config/persistent-ids.ts` as an argument): + +```sh +pnpm --filter @jeswr/solid-federation-vocab exec node scripts/verify-persistent-ids.mjs +``` + +The script checks the 17 existing namespace entries, their legacy predecessor +fields, local artifact filenames and all 51 live Turtle/HTML/JSON-LD URLs. Its +TSV output can be attached to the integration review. Registry edits and +production deployment remain with the portfolio maintainer. ## Links - [Source](https://github.com/jeswr/solid-federation-vocab) -- [`fedapp:` vocabulary](https://w3id.org/jeswr/fed) -- [`fedreg:` vocabulary](https://w3id.org/jeswr/fedreg) +- [`fedapp:` vocabulary](https://jeswr.org/ns/fed) +- [`fedreg:` vocabulary](https://jeswr.org/ns/fedreg) - [Solid Client Identifier Documents](https://solidproject.org/TR/oidc#clientids) ## License diff --git a/packages/solid-federation-vocab/context.jsonld b/packages/solid-federation-vocab/context.jsonld index 8d7fc1612..9e9cf2e5c 100644 --- a/packages/solid-federation-vocab/context.jsonld +++ b/packages/solid-federation-vocab/context.jsonld @@ -3,8 +3,8 @@ "@version": 1.1, "@protected": true, - "fedapp": "https://w3id.org/jeswr/fed#", - "tm": "https://w3id.org/jeswr/task#", + "fedapp": "https://jeswr.org/ns/fed#", + "tm": "https://jeswr.org/ns/task#", "wf": "http://www.w3.org/2005/01/wf/flow#", "dct": "http://purl.org/dc/terms/", "as": "https://www.w3.org/ns/activitystreams#", diff --git a/packages/solid-federation-vocab/docs/context.jsonld b/packages/solid-federation-vocab/docs/context.jsonld index 8d7fc1612..9e9cf2e5c 100644 --- a/packages/solid-federation-vocab/docs/context.jsonld +++ b/packages/solid-federation-vocab/docs/context.jsonld @@ -3,8 +3,8 @@ "@version": 1.1, "@protected": true, - "fedapp": "https://w3id.org/jeswr/fed#", - "tm": "https://w3id.org/jeswr/task#", + "fedapp": "https://jeswr.org/ns/fed#", + "tm": "https://jeswr.org/ns/task#", "wf": "http://www.w3.org/2005/01/wf/flow#", "dct": "http://purl.org/dc/terms/", "as": "https://www.w3.org/ns/activitystreams#", diff --git a/packages/solid-federation-vocab/docs/core-alignments.ttl b/packages/solid-federation-vocab/docs/core-alignments.ttl index 43a449671..9101f4aa3 100644 --- a/packages/solid-federation-vocab/docs/core-alignments.ttl +++ b/packages/solid-federation-vocab/docs/core-alignments.ttl @@ -1,6 +1,6 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix core: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -38,10 +38,12 @@ # This is the auditable seam: every equivalence here is a reviewable claim. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Core Ontology — alignments (gist + W3C bridges)"@en ; - owl:versionInfo "1.0.0" ; - owl:imports ; + owl:versionInfo "2.0.0" ; + owl:imports ; rdfs:comment "Optional Mode-A bridge to gist (discovery) + foaf/schema/prov/org/vcard/adms/dcat. "@en . # Declare the annotation properties used here so this file is self-describing. diff --git a/packages/solid-federation-vocab/docs/core-context.jsonld b/packages/solid-federation-vocab/docs/core-context.jsonld index 4d3242434..65101d54f 100644 --- a/packages/solid-federation-vocab/docs/core-context.jsonld +++ b/packages/solid-federation-vocab/docs/core-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "core": "https://w3id.org/jeswr/core#", + "core": "https://jeswr.org/ns/core#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/core.html b/packages/solid-federation-vocab/docs/core.html index afa67f2fe..fb9b14312 100644 --- a/packages/solid-federation-vocab/docs/core.html +++ b/packages/solid-federation-vocab/docs/core.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/core# — Solid Federation Sector Ontology + jeswr.org/ns/core# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/core#

+

https://jeswr.org/ns/core#

Prefix core: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/core.shacl.ttl b/packages/solid-federation-vocab/docs/core.shacl.ttl index 844f45059..d5dca00f2 100644 --- a/packages/solid-federation-vocab/docs/core.shacl.ttl +++ b/packages/solid-federation-vocab/docs/core.shacl.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix core: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -30,9 +30,11 @@ # (conformingSet(P@J) ⊆ conformingSet(G), R11 §3.4). # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Core Ontology — SHACL profile"@en ; - owl:versionInfo "1.1.0" ; + owl:versionInfo "2.0.0" ; dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "F4 node shapes for the instantiable gUFO-rebased Core classes. Open by default; MUST=Violation, SHOULD=Warning. v1.1.0 validates optional validity dates as date or dateTime. v1.0.1 added core:QuantityShape (numericValue MUST, unit SHOULD)."@en . diff --git a/packages/solid-federation-vocab/docs/core.ttl b/packages/solid-federation-vocab/docs/core.ttl index c82121d92..7ba333e2f 100644 --- a/packages/solid-federation-vocab/docs/core.ttl +++ b/packages/solid-federation-vocab/docs/core.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix core: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -46,13 +46,13 @@ # SKOS/schema.org) live in the SEPARATE optional solid-core-alignments.ttl. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Core Ontology (gUFO re-base)"@en ; rdfs:label "Solid Core Ontology"@en ; vann:preferredNamespacePrefix "core" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/core#" ; - owl:versionInfo "1.1.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/core#" ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; owl:imports ; dcterms:description """The foundational ontology of the Solid data federation, re-based onto gUFO (the gentle OWL-2-DL implementation of @@ -62,7 +62,7 @@ (e.g. core:Relationship and core:Account are now gufo:Relator, not bare classes), so this is a new MAJOR version. The single mandatory import is now gUFO + this thin profile. External vocabularies are reached via the - companion alignments file, never re-derived."""@en ; + companion alignments file, never re-derived. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §1.3. v1.1.0 widens core:validFrom/core:validUntil to date or dateTime; date values mean all-day. v1.0.1 added core:Quantity + core:numericValue/core:unit."@en . diff --git a/packages/solid-federation-vocab/docs/fed.html b/packages/solid-federation-vocab/docs/fed.html index c36b9d616..16445a4dd 100644 --- a/packages/solid-federation-vocab/docs/fed.html +++ b/packages/solid-federation-vocab/docs/fed.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/fed — Solid Federation Vocabulary + jeswr.org/ns/fed — Solid Federation Vocabulary -

https://w3id.org/jeswr/fed#

+

https://jeswr.org/ns/fed#

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

Terms

@@ -51,7 +51,7 @@

Terms

carries no rdfs:domain. sectorsectorThe data sector operated in (e.g. the identity / productivity / media / finance / health / documents / social - sector IRIs under https://w3id.org/jeswr/sectors/). May be attached to + sector IRIs under https://jeswr.org/ns/sectors/). May be attached to an fedapp:App directly, or to an fedapp:SectorUse node — so it carries no rdfs:domain. sectorUsesector useLinks an fedapp:App to an fedapp:SectorUse node — the diff --git a/packages/solid-federation-vocab/docs/fed.ttl b/packages/solid-federation-vocab/docs/fed.ttl index a33678c4b..9112e8b91 100644 --- a/packages/solid-federation-vocab/docs/fed.ttl +++ b/packages/solid-federation-vocab/docs/fed.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # # Federation App-Registration Vocabulary (fedapp:) -# Namespace: https://w3id.org/jeswr/fed# (ADR-0013, prod-solid-server) +# Namespace: https://jeswr.org/ns/fed# (ADR-0013, prod-solid-server) # # The OpenID-Federation-style metadata a Solid app publishes IN its Client # Identifier Document (the .jsonld served at the app's client_id URL). It lets a @@ -13,7 +13,7 @@ # Authored as Turtle directly (source form); machine-built RDF in this repo goes # through n3.Writer / @rdfjs/wrapper typed accessors — never hand-built quads. -@prefix fedapp: . +@prefix fedapp: . @prefix rdf: . @prefix rdfs: . @prefix owl: . @@ -25,18 +25,19 @@ # Ontology ################################################################# - - a owl:Ontology ; + a owl:Ontology ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Federation App-Registration Vocabulary"@en ; dcterms:description """OpenID-Federation-style metadata a Solid app publishes in its Client Identifier Document, describing the data sectors it operates in, the access modes it requests, and the shared - shapes it consumes and produces."""@en ; + shapes it consumes and produces. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; dcterms:creator "Claude Opus 4.8 (@jeswr PSS agent)" ; dcterms:issued "2026-06-15"^^xsd:date ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/fed#" ; + vann:preferredNamespaceUri "https://jeswr.org/ns/fed#" ; vann:preferredNamespacePrefix "fedapp" ; - rdfs:seeAlso ; + rdfs:seeAlso ; rdfs:comment "Experimental — AI-agent-generated; under active development, not production-hardened."@en . ################################################################# @@ -51,7 +52,7 @@ fedapp:App typically the app's client_id IRI (its Client Identifier Document). It declares the sectors, access modes and shapes the app works with."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:AppVersion a rdfs:Class, owl:Class ; @@ -59,7 +60,7 @@ fedapp:AppVersion rdfs:comment """A specific released version of an fedapp:App. Lets a registry track behavioural changes (e.g. a newly requested access mode or a new produced shape) across releases of the same client_id."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:SectorUse a rdfs:Class, owl:Class ; @@ -70,7 +71,7 @@ fedapp:SectorUse scoped to it. Use SectorUse when per-sector access differs; for a flat declaration attach fedapp:sector / fedapp:access directly to the App."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . ################################################################# # Properties @@ -92,17 +93,17 @@ fedapp:sectorUse directly to the App instead."""@en ; rdfs:domain fedapp:App ; rdfs:range fedapp:SectorUse ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:sector a rdf:Property, owl:ObjectProperty ; rdfs:label "sector"@en ; rdfs:comment """The data sector operated in (e.g. the identity / productivity / media / finance / health / documents / social - sector IRIs under https://w3id.org/jeswr/sectors/). May be attached to + sector IRIs under https://jeswr.org/ns/sectors/). May be attached to an fedapp:App directly, or to an fedapp:SectorUse node — so it carries no rdfs:domain."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:access a rdf:Property, owl:ObjectProperty ; @@ -113,7 +114,7 @@ fedapp:access granting consent. Attaches to an fedapp:App or an fedapp:SectorUse — so it carries no rdfs:domain."""@en ; rdfs:range ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:consumes a rdf:Property, owl:ObjectProperty ; @@ -123,7 +124,7 @@ fedapp:consumes consumable from the federation. Pairs with fedapp:produces to draw the producer/consumer graph of the ecosystem. Attaches to an fedapp:App or an fedapp:SectorUse — so it carries no rdfs:domain."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:produces a rdf:Property, owl:ObjectProperty ; @@ -133,7 +134,7 @@ fedapp:produces the federation, so consumers can discover where data of that shape originates. Attaches to an fedapp:App or an fedapp:SectorUse — so it carries no rdfs:domain."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:declaresShape a rdf:Property, owl:ObjectProperty ; @@ -144,4 +145,4 @@ fedapp:declaresShape the app is a source-of-truth definer for that shape."""@en ; rdfs:domain fedapp:App ; rdfs:range ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . diff --git a/packages/solid-federation-vocab/docs/fedapp.ttl b/packages/solid-federation-vocab/docs/fedapp.ttl index a33678c4b..9112e8b91 100644 --- a/packages/solid-federation-vocab/docs/fedapp.ttl +++ b/packages/solid-federation-vocab/docs/fedapp.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # # Federation App-Registration Vocabulary (fedapp:) -# Namespace: https://w3id.org/jeswr/fed# (ADR-0013, prod-solid-server) +# Namespace: https://jeswr.org/ns/fed# (ADR-0013, prod-solid-server) # # The OpenID-Federation-style metadata a Solid app publishes IN its Client # Identifier Document (the .jsonld served at the app's client_id URL). It lets a @@ -13,7 +13,7 @@ # Authored as Turtle directly (source form); machine-built RDF in this repo goes # through n3.Writer / @rdfjs/wrapper typed accessors — never hand-built quads. -@prefix fedapp: . +@prefix fedapp: . @prefix rdf: . @prefix rdfs: . @prefix owl: . @@ -25,18 +25,19 @@ # Ontology ################################################################# - - a owl:Ontology ; + a owl:Ontology ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Federation App-Registration Vocabulary"@en ; dcterms:description """OpenID-Federation-style metadata a Solid app publishes in its Client Identifier Document, describing the data sectors it operates in, the access modes it requests, and the shared - shapes it consumes and produces."""@en ; + shapes it consumes and produces. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; dcterms:creator "Claude Opus 4.8 (@jeswr PSS agent)" ; dcterms:issued "2026-06-15"^^xsd:date ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/fed#" ; + vann:preferredNamespaceUri "https://jeswr.org/ns/fed#" ; vann:preferredNamespacePrefix "fedapp" ; - rdfs:seeAlso ; + rdfs:seeAlso ; rdfs:comment "Experimental — AI-agent-generated; under active development, not production-hardened."@en . ################################################################# @@ -51,7 +52,7 @@ fedapp:App typically the app's client_id IRI (its Client Identifier Document). It declares the sectors, access modes and shapes the app works with."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:AppVersion a rdfs:Class, owl:Class ; @@ -59,7 +60,7 @@ fedapp:AppVersion rdfs:comment """A specific released version of an fedapp:App. Lets a registry track behavioural changes (e.g. a newly requested access mode or a new produced shape) across releases of the same client_id."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:SectorUse a rdfs:Class, owl:Class ; @@ -70,7 +71,7 @@ fedapp:SectorUse scoped to it. Use SectorUse when per-sector access differs; for a flat declaration attach fedapp:sector / fedapp:access directly to the App."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . ################################################################# # Properties @@ -92,17 +93,17 @@ fedapp:sectorUse directly to the App instead."""@en ; rdfs:domain fedapp:App ; rdfs:range fedapp:SectorUse ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:sector a rdf:Property, owl:ObjectProperty ; rdfs:label "sector"@en ; rdfs:comment """The data sector operated in (e.g. the identity / productivity / media / finance / health / documents / social - sector IRIs under https://w3id.org/jeswr/sectors/). May be attached to + sector IRIs under https://jeswr.org/ns/sectors/). May be attached to an fedapp:App directly, or to an fedapp:SectorUse node — so it carries no rdfs:domain."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:access a rdf:Property, owl:ObjectProperty ; @@ -113,7 +114,7 @@ fedapp:access granting consent. Attaches to an fedapp:App or an fedapp:SectorUse — so it carries no rdfs:domain."""@en ; rdfs:range ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:consumes a rdf:Property, owl:ObjectProperty ; @@ -123,7 +124,7 @@ fedapp:consumes consumable from the federation. Pairs with fedapp:produces to draw the producer/consumer graph of the ecosystem. Attaches to an fedapp:App or an fedapp:SectorUse — so it carries no rdfs:domain."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:produces a rdf:Property, owl:ObjectProperty ; @@ -133,7 +134,7 @@ fedapp:produces the federation, so consumers can discover where data of that shape originates. Attaches to an fedapp:App or an fedapp:SectorUse — so it carries no rdfs:domain."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:declaresShape a rdf:Property, owl:ObjectProperty ; @@ -144,4 +145,4 @@ fedapp:declaresShape the app is a source-of-truth definer for that shape."""@en ; rdfs:domain fedapp:App ; rdfs:range ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . diff --git a/packages/solid-federation-vocab/docs/fedcon-context.jsonld b/packages/solid-federation-vocab/docs/fedcon-context.jsonld index 574044731..a7ac94c43 100644 --- a/packages/solid-federation-vocab/docs/fedcon-context.jsonld +++ b/packages/solid-federation-vocab/docs/fedcon-context.jsonld @@ -4,7 +4,7 @@ "@protected": true, "fedcon": "https://jeswr.org/fedcon#", - "fedreg": "https://w3id.org/jeswr/fedreg#", + "fedreg": "https://jeswr.org/ns/fedreg#", "oa": "http://www.w3.org/ns/oa#", "prov": "http://www.w3.org/ns/prov#", "dcat": "http://www.w3.org/ns/dcat#", diff --git a/packages/solid-federation-vocab/docs/fedcon.shacl.ttl b/packages/solid-federation-vocab/docs/fedcon.shacl.ttl index 2bdd818c8..5d8dffa72 100644 --- a/packages/solid-federation-vocab/docs/fedcon.shacl.ttl +++ b/packages/solid-federation-vocab/docs/fedcon.shacl.ttl @@ -2,7 +2,7 @@ # @prefix fedcon: . @prefix fcsh: . -@prefix fedreg: . +@prefix fedreg: . @prefix oa: . @prefix prov: . @prefix sh: . @@ -22,7 +22,7 @@ # Info=MAY); IMMUTABLE version IRI; additive. # # Rooted at https://jeswr.org/fedcon/profile (the jeswr.org namespace of fedcon:, -# NOT w3id.org/jeswr like the sector profiles). This is a BEST-EFFORT structural +# NOT jeswr.org/ns like the sector profiles). This is a BEST-EFFORT structural # encoding of the contribution-api-design: several rules (recompute-and-compare # the concept hash, cross-graph "respond to every unresolved Oppose", the # per-registry evidence threshold) are genuinely SERVICE-SIDE and cannot be diff --git a/packages/solid-federation-vocab/docs/fedcon.ttl b/packages/solid-federation-vocab/docs/fedcon.ttl index 2c34b91b3..7e3f23860 100644 --- a/packages/solid-federation-vocab/docs/fedcon.ttl +++ b/packages/solid-federation-vocab/docs/fedcon.ttl @@ -5,8 +5,8 @@ # # The GOVERNANCE / GLUE vocabulary for the concept-federation registry's # contribution + admission lifecycle. It is the WRITE-side companion to the -# DISCOVERY-side fedreg: (https://w3id.org/jeswr/fedreg#) and the SELF-ASSERTED -# fedapp: (https://w3id.org/jeswr/fed#): where fedreg: describes WHO is a member +# DISCOVERY-side fedreg: (https://jeswr.org/ns/fedreg#) and the SELF-ASSERTED +# fedapp: (https://jeswr.org/ns/fed#): where fedreg: describes WHO is a member # and WHICH specs a storage accepts, fedcon: describes HOW a concept crystallises # into a federation — proposed, publicly commented, and admitted (or rejected) by # a registry authority. @@ -29,14 +29,10 @@ # (SHACL-enforced), a direct port of the unite fut:SharedFuture dissent annex — # manufactured consensus is never permitted. # -# NAMESPACE NOTE — https://jeswr.org/fedcon# (NOT w3id.org/jeswr): unlike the -# sibling governance vocabularies (fedapp:/fedreg:/task:/core:/the sectors), which -# are w3id.org-rooted, fedcon: mints under the maintainer's now-live jeswr.org -# domain. This avoids a dependency on the still-pending w3id.org redirect PR for -# NEW work; LIVE resolution of https://jeswr.org/fedcon is a pending jeswr.org -# hosting/DNS decision (out of scope for this vocab-only phase). Cross-namespace -# references (a fedcon: term pointing at a w3id.org fedreg: term, and vice-versa) -# are ordinary RDF and completely fine. +# NAMESPACE NOTE — https://jeswr.org/fedcon# is preserved by DECISIONS V1. +# The sibling fedapp:/fedreg:/task:/core: and sector vocabularies now use +# https://jeswr.org/ns/. References to those siblings follow their new bases; +# fedcon's own ontology identity, term IRIs and version are unchanged. # # REUSE, DON'T REINVENT (the LD/SW house rule): fedcon: mints ONLY the federation # contribution/admission + content-addressed-snapshot glue. Web Annotation (oa:) for @@ -57,7 +53,7 @@ # n3.Writer / @rdfjs/wrapper typed accessors — never hand-built quads. @prefix fedcon: . -@prefix fedreg: . +@prefix fedreg: . @prefix dcat: . @prefix hydra: . @prefix oa: . @@ -88,7 +84,7 @@ dcterms:modified "2026-07-07"^^xsd:date ; vann:preferredNamespaceUri "https://jeswr.org/fedcon#" ; vann:preferredNamespacePrefix "fedcon" ; - rdfs:seeAlso ; + rdfs:seeAlso ; rdfs:comment "Experimental — AI-agent-generated; under active development, not production-hardened."@en . ################################################################# diff --git a/packages/solid-federation-vocab/docs/fedreg-context.jsonld b/packages/solid-federation-vocab/docs/fedreg-context.jsonld index 3ec760b28..8c78c6c3f 100644 --- a/packages/solid-federation-vocab/docs/fedreg-context.jsonld +++ b/packages/solid-federation-vocab/docs/fedreg-context.jsonld @@ -3,8 +3,8 @@ "@version": 1.1, "@protected": true, - "fedreg": "https://w3id.org/jeswr/fedreg#", - "fedapp": "https://w3id.org/jeswr/fed#", + "fedreg": "https://jeswr.org/ns/fedreg#", + "fedapp": "https://jeswr.org/ns/fed#", "dcat": "http://www.w3.org/ns/dcat#", "dct": "http://purl.org/dc/terms/", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", diff --git a/packages/solid-federation-vocab/docs/fedreg.html b/packages/solid-federation-vocab/docs/fedreg.html index ed9c91483..59159594c 100644 --- a/packages/solid-federation-vocab/docs/fedreg.html +++ b/packages/solid-federation-vocab/docs/fedreg.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/fedreg — Solid Federation Vocabulary + jeswr.org/ns/fedreg — Solid Federation Vocabulary -

https://w3id.org/jeswr/fedreg#

+

https://jeswr.org/ns/fedreg#

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

Terms

@@ -115,7 +115,7 @@

Terms

substrate for asynchronous schema migration: during a dual-read window the storage advertises both versions, so participants upgrade on their own clock. The subject is typically the storage root IRI. - supportsSectorsupports sectorA data sector IRI (a https://w3id.org/jeswr/sectors/<sector> + supportsSectorsupports sectorA data sector IRI (a https://jeswr.org/ns/sectors/<sector> marker) that this fedreg:StorageDescription's storage supports. Lets an app discover which storages can hold its sector's data before attempting a write. diff --git a/packages/solid-federation-vocab/docs/fedreg.ttl b/packages/solid-federation-vocab/docs/fedreg.ttl index 0de01733b..c04a5c43b 100644 --- a/packages/solid-federation-vocab/docs/fedreg.ttl +++ b/packages/solid-federation-vocab/docs/fedreg.ttl @@ -1,12 +1,12 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # # Federation Catalogue / Registry Vocabulary (fedreg:) -# Namespace: https://w3id.org/jeswr/fedreg# (ADR-0013, prod-solid-server) +# Namespace: https://jeswr.org/ns/fedreg# (ADR-0013, prod-solid-server) # # The "Catalogue / Registry" federation service — one of the five services a # Solid federation node provides (R9 §2.2 / research brief 09 §2 + §6 rec #6 in # jeswr/full-solid-ecosystem). It is the DISCOVERY axis, distinct from: -# - fedapp: (https://w3id.org/jeswr/fed#) — an app's SELF-ASSERTED registration +# - fedapp: (https://jeswr.org/ns/fed#) — an app's SELF-ASSERTED registration # in its Client Identifier Document; and # - the Vocabulary/Spec Hub — the canonical, versioned client-client specs. # @@ -42,8 +42,8 @@ # @jeswr/federation-registry goes through n3.Writer / @rdfjs/wrapper typed # accessors — never hand-built quads. -@prefix fedreg: . -@prefix fedapp: . +@prefix fedreg: . +@prefix fedapp: . @prefix fedcon: . @prefix rdf: . @prefix rdfs: . @@ -57,20 +57,21 @@ # Ontology ################################################################# - - a owl:Ontology ; + a owl:Ontology ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Federation Catalogue / Registry Vocabulary"@en ; dcterms:description """The Catalogue / Registry federation service: a registry document listing member apps with a registry-asserted membership status, and a resource-server catalogue entry advertising which client-client spec-versions and data sectors it accepts. The discovery axis of a Solid data federation, distinct from an app's self-asserted - fedapp: registration."""@en ; + fedapp: registration. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; dcterms:creator "Claude Opus 4.8 (@jeswr PSS agent)" ; dcterms:issued "2026-06-16"^^xsd:date ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/fedreg#" ; + vann:preferredNamespaceUri "https://jeswr.org/ns/fedreg#" ; vann:preferredNamespacePrefix "fedreg" ; - rdfs:seeAlso ; + rdfs:seeAlso ; rdfs:comment "Experimental — AI-agent-generated; under active development, not production-hardened."@en . ################################################################# @@ -88,7 +89,7 @@ fedreg:Registry documents, a Registry's entries carry the registry's OWN membership assertion — so a consumer can trust the listing as a membership claim, not merely an app's self-description."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:RegistryAssertion a rdfs:Class, owl:Class ; @@ -106,7 +107,7 @@ fedreg:RegistryAssertion fedreg:assertedBy authority a verifier checks against its trust set. (The cryptographic signature binding the assertion to that authority is layered above this vocabulary.)"""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:Membership a rdfs:Class, owl:Class ; @@ -125,7 +126,7 @@ fedreg:Membership REGISTRY-ASSERTED counterpart to the app's self-asserted fedapp:App: a verifier treats a Membership as a membership claim only when it is asserted by a recognised authority — never the app's own fedapp: document."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:MembershipStatus a rdfs:Class, owl:Class ; @@ -136,7 +137,7 @@ fedreg:MembershipStatus recovery lever (brief 07 'recovery'): a misbehaving app is suspended or revoked at the registry without touching the app's own self-asserted document."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:StorageDescription a rdfs:Class, owl:Class ; @@ -149,7 +150,7 @@ fedreg:StorageDescription substrate for asynchronous schema migration: during a dual-read window the storage advertises both versions, so participants upgrade on their own clock. The subject is typically the storage root IRI."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . ################################################################# # Membership-status coded values (instances of MembershipStatus) @@ -160,7 +161,7 @@ fedreg:Proposed rdfs:label "Proposed"@en ; rdfs:comment """A membership proposed but not yet ratified by the federation's Scheme Authority — the app appears in the registry pending review."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:Active a fedreg:MembershipStatus ; @@ -168,7 +169,7 @@ fedreg:Active rdfs:comment """A current, ratified membership — the app is a recognised member of the federation and its self-asserted fedapp: footprint has been accepted."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:Suspended a fedreg:MembershipStatus ; @@ -176,7 +177,7 @@ fedreg:Suspended rdfs:comment """A membership temporarily withdrawn (e.g. pending investigation of a data-integrity issue). Reversible — distinct from fedreg:Revoked. The recovery lever for a misbehaving member."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:Revoked a fedreg:MembershipStatus ; @@ -184,7 +185,7 @@ fedreg:Revoked rdfs:comment """A membership permanently withdrawn — the app is no longer a member. A consumer MUST treat a revoked member as untrusted regardless of the app's own self-asserted fedapp: claims."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . ################################################################# # Properties — Registry / Membership @@ -199,7 +200,7 @@ fedreg:member rdfs:domain fedreg:Registry ; rdfs:range fedreg:Membership ; rdfs:subPropertyOf ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:app a rdf:Property, owl:ObjectProperty ; @@ -209,7 +210,7 @@ fedreg:app self-description)."""@en ; rdfs:domain fedreg:Membership ; rdfs:range fedapp:App ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . # ----------------------------------------------------------------------------- # G1 domain-widening — a DELIBERATE, backward-compatible generalisation. @@ -248,7 +249,7 @@ fedreg:status this membership-shaped status.)"""@en ; rdfs:domain fedreg:RegistryAssertion ; rdfs:range fedreg:MembershipStatus ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:assertedBy a rdf:Property, owl:ObjectProperty ; @@ -261,7 +262,7 @@ fedreg:assertedBy cryptographic signature binding the assertion to that authority is layered above this vocabulary.)"""@en ; rdfs:domain fedreg:RegistryAssertion ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:asserted a rdf:Property, owl:DatatypeProperty ; @@ -271,7 +272,7 @@ fedreg:asserted fedreg:RegistryAssertion (a fedreg:Membership or a fedcon:Admission)."""@en ; rdfs:domain fedreg:RegistryAssertion ; rdfs:range xsd:dateTime ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . ################################################################# # Properties — StorageDescription (spec-version acceptance + sectors) @@ -300,17 +301,17 @@ fedreg:acceptsSpec distinguished by IRI scheme; the existing spec-version usage is unchanged."""@en ; rdfs:domain fedreg:StorageDescription ; rdfs:seeAlso ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:supportsSector a rdf:Property, owl:ObjectProperty ; rdfs:label "supports sector"@en ; - rdfs:comment """A data sector IRI (a https://w3id.org/jeswr/sectors/ + rdfs:comment """A data sector IRI (a https://jeswr.org/ns/sectors/ marker) that this fedreg:StorageDescription's storage supports. Lets an app discover which storages can hold its sector's data before attempting a write."""@en ; rdfs:domain fedreg:StorageDescription ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:storage a rdf:Property, owl:ObjectProperty ; @@ -320,4 +321,4 @@ fedreg:storage description's subject, but explicit when a registry collates many storage descriptions in one document."""@en ; rdfs:domain fedreg:StorageDescription ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . diff --git a/packages/solid-federation-vocab/docs/index.html b/packages/solid-federation-vocab/docs/index.html index f6b54e86d..32e03904a 100644 --- a/packages/solid-federation-vocab/docs/index.html +++ b/packages/solid-federation-vocab/docs/index.html @@ -4,7 +4,7 @@ - w3id.org/jeswr — Solid Federation Vocabularies + jeswr.org/ns — Solid Federation Vocabularies -

https://w3id.org/jeswr/sectors/bookmarks#

+

https://jeswr.org/ns/sectors/bookmarks#

Prefix bookmark: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/bookmarks.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/bookmarks.shacl.ttl index 2e1df4e69..9d89f8d7b 100644 --- a/packages/solid-federation-vocab/docs/sectors/bookmarks.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/bookmarks.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix bookmark: . -@prefix bmsh: . -@prefix core: . +@prefix bookmark: . +@prefix bmsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -20,16 +20,16 @@ # grade (Violation=MUST, Warning=SHOULD, Info=MAY); IMMUTABLE version IRI; additive. # ============================================================================= - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Bookmarks data-model profile (version-independent)"@en ; - dcterms:hasVersion ; + dcterms:hasVersion ; rdfs:comment "Version-independent IRI resolving to the current Bookmarks profile. "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Bookmarks data-model profile 1.0.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "bookmarks-1.0.0" ; rdfs:comment "IMMUTABLE version IRI. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . diff --git a/packages/solid-federation-vocab/docs/sectors/bookmarks.ttl b/packages/solid-federation-vocab/docs/sectors/bookmarks.ttl index 2283e30c2..eba65d67d 100644 --- a/packages/solid-federation-vocab/docs/sectors/bookmarks.ttl +++ b/packages/solid-federation-vocab/docs/sectors/bookmarks.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix bookmark: . -@prefix core: . +@prefix bookmark: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -22,7 +22,7 @@ # Bookmark class to hang the SHACL shape + alignments off, and the round-trip # property spine a fork needs (the saved-target URL, an archived flag, free-text # notes, tags). The detailed bookmark vocab (book: = -# https://w3id.org/jeswr/bookmark#, with book:Bookmark, book:archived xsd:boolean, +# https://jeswr.org/ns/bookmark#, with book:Bookmark, book:archived xsd:boolean, # book:notes) ships in the SEPARATE @jeswr/solid-bookmark repo; the alignment HOOKS # to those forthcoming book: terms + to schema.org/dct/skos live in # bookmarks-alignments.ttl (Mode A, annotation-only, no entailment) so this sector @@ -36,14 +36,14 @@ # carries the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Bookmarks & Read-it-later Sector Ontology"@en ; rdfs:label "Solid Bookmarks & Read-it-later Sector Ontology"@en ; vann:preferredNamespacePrefix "bookmark" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/bookmarks#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/bookmarks#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The bookmarks / read-it-later data sector — the domain a federated Linkding-style fork operates in. Authors the sector marker and a thin gUFO-rooted bookmark:Bookmark (a core:InformationResource saved @@ -52,8 +52,8 @@ vocabulary ships in the separate @jeswr/solid-bookmark repo; this file aligns to those forthcoming terms and to schema.org (schema:url, schema:BookmarkAction), Dublin Core Terms and SKOS in the companion - alignments file."""@en ; - dcterms:modified "2026-06-21"^^xsd:date ; + alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Foundation sector for the 5-OSS-fork initiative (Linkding)."@en . # ----------------------------------------------------------------------------- @@ -106,13 +106,13 @@ bookmark:hasTag a owl:ObjectProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Bookmarks & Read-it-later sector"@en ; rdfs:comment "The Bookmarks & Read-it-later data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over bookmark / read-it-later data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Bookmarks & Read-it-later"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/collectibles-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/collectibles-alignments.ttl index 96e3a083d..b3dab12be 100644 --- a/packages/solid-federation-vocab/docs/sectors/collectibles-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/collectibles-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix col: . -@prefix core: . +@prefix col: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix rdf: . @@ -32,10 +32,12 @@ # only ANNOTATES the closest CRM/linked.art analogues here. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Collectibles sector — external alignments"@en ; - owl:imports ; - owl:versionInfo "0.1.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; rdfs:comment "Optional Mode-A bridge: schema.org amount/creative-work terms, PROV-O activity/attribution framing, and linked.art (CIDOC-CRM) art-market analogues as reference only. External IRIs are real and governed by their bodies. Nothing is owl:imported into the reasoned closure."@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/docs/sectors/collectibles-context.jsonld b/packages/solid-federation-vocab/docs/sectors/collectibles-context.jsonld index 36a4a5727..ab7b82db7 100644 --- a/packages/solid-federation-vocab/docs/sectors/collectibles-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/collectibles-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "col": "https://w3id.org/jeswr/sectors/collectibles#", + "col": "https://jeswr.org/ns/sectors/collectibles#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/sectors/collectibles.html b/packages/solid-federation-vocab/docs/sectors/collectibles.html index fe6a430ef..48dfe38b3 100644 --- a/packages/solid-federation-vocab/docs/sectors/collectibles.html +++ b/packages/solid-federation-vocab/docs/sectors/collectibles.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/collectibles# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/collectibles# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/collectibles#

+

https://jeswr.org/ns/sectors/collectibles#

Prefix col: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/collectibles.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/collectibles.shacl.ttl index f907500df..50d97d6ca 100644 --- a/packages/solid-federation-vocab/docs/sectors/collectibles.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/collectibles.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix col: . -@prefix colsh: . -@prefix core: . +@prefix col: . +@prefix colsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -39,26 +39,26 @@ # - IMMUTABLE version IRI (.../collectibles/profile/0.1.0); additive-only. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Collectibles data-model profile (version-independent)"@en ; dcterms:description "Resolves to the current Collectibles sector profile version."@en . - + a prof:Profile ; dcterms:title "Solid Collectibles data-model profile"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "0.1.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-collectibles-0.1.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for the collectibles sector."@en . diff --git a/packages/solid-federation-vocab/docs/sectors/collectibles.ttl b/packages/solid-federation-vocab/docs/sectors/collectibles.ttl index 363f45e7d..ad75a59b5 100644 --- a/packages/solid-federation-vocab/docs/sectors/collectibles.ttl +++ b/packages/solid-federation-vocab/docs/sectors/collectibles.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix col: . -@prefix core: . +@prefix col: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -60,14 +60,14 @@ # hygiene: external classes referenced in axioms are declared as punned owl terms. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Collectibles Sector Ontology"@en ; rdfs:label "Solid Collectibles Sector Ontology"@en ; vann:preferredNamespacePrefix "col" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/collectibles#" ; - owl:imports ; - owl:versionInfo "0.1.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/collectibles#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The provenance / valuation / insurance data sector for high-value collectible assets (art, antiques, wine, watches, cars) — the sector the Provena revenue product operates in. The asset itself stays a @@ -78,8 +78,8 @@ Replaces the reserved provena.example.org namespace and the non-existent schema:artworkMedium/artworkSize terms. Aligns Mode-A to schema.org, PROV-O and the linked.art (CIDOC-CRM) art-market profile in - collectibles-alignments.ttl."""@en ; - dcterms:modified "2026-07-03"^^xsd:date ; + collectibles-alignments.ttl. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Sector ontology for the Provena product (revenue-products ontology review §1). PROV-O primary, used correctly; linked.art alignment is reference-only, never adopted."@en . # ----------------------------------------------------------------------------- @@ -318,9 +318,9 @@ col:precision-circa a col:DatePrecision, skos:Concept ; # federation sector register; dereferences to this ontology. # ============================================================================= - + a skos:Concept ; rdfs:label "Collectibles sector"@en ; rdfs:comment "The Collectibles (art / collectibles provenance, valuation and insurance) data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over collectible-asset provenance data — the sector the Provena product declares. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Collectibles"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/contacts-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/contacts-alignments.ttl index d130819f2..eebcafec3 100644 --- a/packages/solid-federation-vocab/docs/sectors/contacts-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/contacts-alignments.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix contact: . -@prefix core: . +@prefix contact: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -35,12 +35,13 @@ # collapse two distinct Core classes (contract §3). # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; dcterms:title "Solid Contacts Sector Ontology — vcard & schema.org alignments (gUFO re-base)"@en ; - owl:imports ; - owl:versionInfo "1.1.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; dcterms:modified "2026-10-25"^^xsd:date ; - owl:versionIRI ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to vcard (the canonical contacts vocab) and schema.org. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/docs/sectors/contacts-context.jsonld b/packages/solid-federation-vocab/docs/sectors/contacts-context.jsonld index ea92c807d..2c5f364a5 100644 --- a/packages/solid-federation-vocab/docs/sectors/contacts-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/contacts-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "contact": "https://w3id.org/jeswr/sectors/contacts#", + "contact": "https://jeswr.org/ns/sectors/contacts#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/sectors/contacts.html b/packages/solid-federation-vocab/docs/sectors/contacts.html index 2b590c4b5..b398f2f01 100644 --- a/packages/solid-federation-vocab/docs/sectors/contacts.html +++ b/packages/solid-federation-vocab/docs/sectors/contacts.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/contacts# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/contacts# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/contacts#

+

https://jeswr.org/ns/sectors/contacts#

Prefix contact: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/contacts.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/contacts.shacl.ttl index e8848cc7c..6fe1a8c57 100644 --- a/packages/solid-federation-vocab/docs/sectors/contacts.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/contacts.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix ctsh: . -@prefix contact: . -@prefix core: . +@prefix ctsh: . +@prefix contact: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -24,18 +24,18 @@ # v1.0.0 tracks the gUFO re-base of contacts.ttl. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Contacts data-model profile (gUFO re-base)"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - owl:versionIRI ; - prof:isProfileOf , + owl:versionIRI ; + prof:isProfileOf , ; prof:hasToken "contacts-1.0.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for address-book data, re-based onto the gUFO Core. "@en . diff --git a/packages/solid-federation-vocab/docs/sectors/contacts.ttl b/packages/solid-federation-vocab/docs/sectors/contacts.ttl index ecce289f1..2eb71872f 100644 --- a/packages/solid-federation-vocab/docs/sectors/contacts.ttl +++ b/packages/solid-federation-vocab/docs/sectors/contacts.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix contact: . -@prefix core: . +@prefix contact: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -46,14 +46,14 @@ # default; the SHACL profile carries the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Contacts Sector Ontology (gUFO re-base)"@en ; rdfs:label "Solid Contacts Sector Ontology"@en ; vann:preferredNamespacePrefix "contact" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/contacts#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/contacts#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The address-book / contacts sector model for the Solid federation, re-based onto the gUFO Core. A Contact is a core:Record ABOUT a Person or Organization (the card distinct from the agent it names); @@ -63,8 +63,8 @@ roles; lists are core:Group. v1.0.0 is a BREAKING re-base of v0 (the meta-types and the role model change meaning), so a new MAJOR version. Aligns thoroughly to vcard and to schema:ContactPoint/PostalAddress in - the companion alignments file."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + the companion alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2."@en . # ----------------------------------------------------------------------------- @@ -276,13 +276,13 @@ contact:hasMemberContact a owl:ObjectProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Contacts sector"@en ; rdfs:comment "The Contacts data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over contacts data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Contacts"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/drawing-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/drawing-alignments.ttl index 03efe0686..5ec565a65 100644 --- a/packages/solid-federation-vocab/docs/sectors/drawing-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/drawing-alignments.ttl @@ -1,14 +1,14 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix drawing: . -@prefix core: . +@prefix drawing: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @prefix dcterms: . @prefix schema: . # The forthcoming detailed drawing vocabulary (ships in @jeswr/solid-drawing). -@prefix draw: . +@prefix draw: . # ============================================================================= # Drawing Sector Ontology — ALIGNMENTS (Mode A: annotation-only bridges) @@ -23,9 +23,12 @@ # Every line is a reviewable claim; nothing is silently inherited. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Solid Drawing Sector Ontology — draw: + schema.org Mode-A alignments"@en ; - owl:imports ; + owl:imports ; rdfs:comment "Annotation-only (skos:*Match) bridges to the forthcoming @jeswr/solid-drawing draw: vocabulary and to schema.org. No entailment. "@en . # --- Scene <-> draw:Scene (the forthcoming detail vocab) + schema:CreativeWork --- diff --git a/packages/solid-federation-vocab/docs/sectors/drawing-context.jsonld b/packages/solid-federation-vocab/docs/sectors/drawing-context.jsonld index 1aa1043e7..4007a81fc 100644 --- a/packages/solid-federation-vocab/docs/sectors/drawing-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/drawing-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "drawing": "https://w3id.org/jeswr/sectors/drawing#", + "drawing": "https://jeswr.org/ns/sectors/drawing#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/sectors/drawing.html b/packages/solid-federation-vocab/docs/sectors/drawing.html index 9c7300a46..a72ceaedc 100644 --- a/packages/solid-federation-vocab/docs/sectors/drawing.html +++ b/packages/solid-federation-vocab/docs/sectors/drawing.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/drawing# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/drawing# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/drawing#

+

https://jeswr.org/ns/sectors/drawing#

Prefix drawing: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/drawing.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/drawing.shacl.ttl index 10979db71..d9aee2fdf 100644 --- a/packages/solid-federation-vocab/docs/sectors/drawing.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/drawing.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix drawing: . -@prefix drsh: . -@prefix core: . +@prefix drawing: . +@prefix drsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -18,16 +18,16 @@ # grade (Violation=MUST, Warning=SHOULD, Info=MAY); IMMUTABLE version IRI; additive. # ============================================================================= - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Drawing data-model profile (version-independent)"@en ; - dcterms:hasVersion ; + dcterms:hasVersion ; rdfs:comment "Version-independent IRI resolving to the current Drawing profile. "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Drawing data-model profile 1.0.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "drawing-1.0.0" ; rdfs:comment "IMMUTABLE version IRI. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . diff --git a/packages/solid-federation-vocab/docs/sectors/drawing.ttl b/packages/solid-federation-vocab/docs/sectors/drawing.ttl index a5d973f6b..5a862d629 100644 --- a/packages/solid-federation-vocab/docs/sectors/drawing.ttl +++ b/packages/solid-federation-vocab/docs/sectors/drawing.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix drawing: . -@prefix core: . +@prefix drawing: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -21,7 +21,7 @@ # SCOPE — this file authors the SECTOR ONLY: the domain marker, a thin gUFO-rooted # Scene class to hang the SHACL shape + alignments off, and the property spine the # fork actually needs to round-trip a scene to a pod. The detailed drawing vocab -# (draw: = https://w3id.org/jeswr/drawing#, with draw:Scene rdfs:subClassOf +# (draw: = https://jeswr.org/ns/drawing#, with draw:Scene rdfs:subClassOf # schema:CreativeWork, draw:sceneDocument, draw:schemaVersion, draw:thumbnail) # ships in the SEPARATE @jeswr/solid-drawing repo; the alignment HOOKS to those # forthcoming draw: terms live in drawing-alignments.ttl (Mode A, annotation-only, @@ -35,22 +35,22 @@ # the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Drawing & Whiteboard Sector Ontology"@en ; rdfs:label "Solid Drawing & Whiteboard Sector Ontology"@en ; vann:preferredNamespacePrefix "drawing" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/drawing#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/drawing#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The whiteboard / diagramming data sector — the domain a federated Excalidraw-style fork operates in. Authors the sector marker and a thin gUFO-rooted drawing:Scene (a core:InformationResource creative work) with the round-trip property spine (the opaque scene document, a schema version, an optional thumbnail). The detailed draw: vocabulary ships in the separate @jeswr/solid-drawing repo; this file aligns to those forthcoming - terms and to schema:CreativeWork in the companion alignments file."""@en ; - dcterms:modified "2026-06-21"^^xsd:date ; + terms and to schema:CreativeWork in the companion alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Foundation sector for the 5-OSS-fork initiative (Excalidraw)."@en . # ----------------------------------------------------------------------------- @@ -104,13 +104,13 @@ drawing:thumbnail a owl:ObjectProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Drawing & Whiteboard sector"@en ; rdfs:comment "The Drawing & Whiteboard data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over whiteboard / diagramming data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Drawing & Whiteboard"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/equine-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/equine-alignments.ttl index 299eea057..c28683202 100644 --- a/packages/solid-federation-vocab/docs/sectors/equine-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/equine-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix eq: . -@prefix core: . +@prefix eq: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix rdf: . @@ -29,10 +29,12 @@ # are load-bearing rdfs:subClassOf edges in equine.ttl, not annotations here. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Equine sector — external alignments"@en ; - owl:imports ; - owl:versionInfo "0.1.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; rdfs:comment "Optional Mode-A bridge: the W3C Organization ontology for syndicates, schema.org for the price/amount predicates, and a broad DBpedia animal anchor for eq:Horse (schema.org has no animal class). External IRIs are real and governed by their bodies. Nothing is owl:imported into the reasoned closure."@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/docs/sectors/equine-context.jsonld b/packages/solid-federation-vocab/docs/sectors/equine-context.jsonld index 715f8a5d8..2c9def2b4 100644 --- a/packages/solid-federation-vocab/docs/sectors/equine-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/equine-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "eq": "https://w3id.org/jeswr/sectors/equine#", + "eq": "https://jeswr.org/ns/sectors/equine#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/sectors/equine.html b/packages/solid-federation-vocab/docs/sectors/equine.html index 75b3a6633..c63c0f793 100644 --- a/packages/solid-federation-vocab/docs/sectors/equine.html +++ b/packages/solid-federation-vocab/docs/sectors/equine.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/equine# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/equine# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/equine#

+

https://jeswr.org/ns/sectors/equine#

Prefix eq: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/equine.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/equine.shacl.ttl index 1cc4a58d6..88c8e6db1 100644 --- a/packages/solid-federation-vocab/docs/sectors/equine.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/equine.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix eq: . -@prefix eqsh: . -@prefix core: . +@prefix eq: . +@prefix eqsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -40,26 +40,26 @@ # - IMMUTABLE version IRI (.../equine/profile/0.1.0); additive-only. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Equine data-model profile (version-independent)"@en ; dcterms:description "Resolves to the current Equine sector profile version."@en . - + a prof:Profile ; dcterms:title "Solid Equine data-model profile"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "0.1.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-equine-0.1.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for the equine sector."@en . diff --git a/packages/solid-federation-vocab/docs/sectors/equine.ttl b/packages/solid-federation-vocab/docs/sectors/equine.ttl index d97b5f8a2..776a7a729 100644 --- a/packages/solid-federation-vocab/docs/sectors/equine.ttl +++ b/packages/solid-federation-vocab/docs/sectors/equine.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix eq: . -@prefix core: . +@prefix eq: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -23,7 +23,7 @@ # resource — coins a different IRI for the same concept: no cross-pod query, no # SHACL shape, no federation membership. This sector REPLACES that whole # `flgPred`/`flgClass` map 1:1 with shared `eq:` terms at a domain the suite owns -# (w3id.org/jeswr), and REPLACES the NON-EXISTENT schema.org terms Furlong wrote: +# (jeswr.org/ns), and REPLACES the NON-EXISTENT schema.org terms Furlong wrote: # - schema:Animal (HTTP 404 — schema.org has no animal class) → eq:Horse; # - schema:prize (HTTP 404 — schema:award (Text) exists) → eq:PrizeDistribution; # - schema:season (media-series only, superseded) → eq:season; @@ -58,14 +58,14 @@ # referenced in axioms are declared as punned owl terms. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Equine Sector Ontology"@en ; rdfs:label "Solid Equine Sector Ontology"@en ; vann:preferredNamespacePrefix "eq" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/equine#" ; - owl:imports ; - owl:versionInfo "0.1.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/equine#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The racehorse ownership / breeding / prize data sector for the Furlong revenue product: horses, ownership + stud shares held via syndicates, stud nominations, race results and prize distributions, plus @@ -74,8 +74,8 @@ schema:Animal/schema:prize/schema:season terms with correct ones. Keeps the real schema.org dual-types (Reservation/SportsEvent/MoneyTransfer). Aligns Mode-A to schema.org, org: and external animal ontologies in - equine-alignments.ttl."""@en ; - dcterms:modified "2026-07-03"^^xsd:date ; + equine-alignments.ttl. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Sector ontology for the Furlong product (revenue-products ontology review §2). Fixes non-existent schema terms + the per-resource-IRI anti-pattern."@en . # ----------------------------------------------------------------------------- @@ -519,9 +519,9 @@ eq:expense-other a eq:ExpenseCategory, skos:Concept ; # federation sector register; dereferences to this ontology. # ============================================================================= - + a skos:Concept ; rdfs:label "Equine sector"@en ; rdfs:comment "The Equine (racehorse ownership, breeding, prize distribution) data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over equine-ownership data — the sector the Furlong product declares. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Equine"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/finance-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/finance-alignments.ttl index ab2783e9a..0723e62fa 100644 --- a/packages/solid-federation-vocab/docs/sectors/finance-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/finance-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix fin: . -@prefix core: . +@prefix fin: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -42,9 +42,12 @@ # Every line is a reviewable claim; nothing is silently inherited. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Solid Finance Sector Ontology — FIBO + ISO 20022 Mode-A alignments"@en ; - owl:imports ; + owl:imports ; rdfs:comment "Annotation-only (skos:closeMatch) bridges to FIBO terms outside the slim module and to ISO 20022. Mode-B FIBO reuse (subClassOf the slim module) is in finance.ttl. "@en . # --- Accounts: subtype-level FIBO matches not carried by the slim module --- diff --git a/packages/solid-federation-vocab/docs/sectors/finance-context.jsonld b/packages/solid-federation-vocab/docs/sectors/finance-context.jsonld index 550f6aef3..cdf3ae6e8 100644 --- a/packages/solid-federation-vocab/docs/sectors/finance-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/finance-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "fin": "https://w3id.org/jeswr/sectors/finance#", + "fin": "https://jeswr.org/ns/sectors/finance#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/sectors/finance.html b/packages/solid-federation-vocab/docs/sectors/finance.html index 96156b807..71d5a1e59 100644 --- a/packages/solid-federation-vocab/docs/sectors/finance.html +++ b/packages/solid-federation-vocab/docs/sectors/finance.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/finance# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/finance# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/finance#

+

https://jeswr.org/ns/sectors/finance#

Prefix fin: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/finance.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/finance.shacl.ttl index 62b21d520..dd68aa45c 100644 --- a/packages/solid-federation-vocab/docs/sectors/finance.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/finance.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix fin: . -@prefix finsh: . -@prefix core: . +@prefix fin: . +@prefix finsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -23,34 +23,34 @@ # - IMMUTABLE version IRI (…/1.0.0) + version-independent IRI; additive-only. # ============================================================================= - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Finance data-model profile (version-independent)"@en ; - dcterms:hasVersion , - , - ; + dcterms:hasVersion , + , + ; rdfs:comment "Version-independent IRI resolving to the current Finance profile (latest: 1.2.0). "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Finance data-model profile 1.0.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "finance-1.0.0" ; rdfs:comment "IMMUTABLE version IRI. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Finance data-model profile 1.1.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.1.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "finance-1.1.0" ; rdfs:comment "IMMUTABLE version IRI. ADDITIVE over 1.0.0: adds the Budget + BudgetCategory (envelope) shapes for the Actual Budget use case. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Finance data-model profile 1.2.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.2.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "finance-1.2.0" ; rdfs:comment "IMMUTABLE version IRI. ADDITIVE over 1.1.0: adds the double-entry LEDGER shapes (LedgerAccount/JournalEntry/LedgerEntry — Keystone) and the private-equity shapes (Fund/Commitment/Notice — CapNote). Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . diff --git a/packages/solid-federation-vocab/docs/sectors/finance.ttl b/packages/solid-federation-vocab/docs/sectors/finance.ttl index 1f4ed1a8c..419633777 100644 --- a/packages/solid-federation-vocab/docs/sectors/finance.ttl +++ b/packages/solid-federation-vocab/docs/sectors/finance.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix fin: . -@prefix core: . +@prefix fin: . +@prefix core: . @prefix gufo: . @prefix owl: . @prefix rdf: . @@ -51,15 +51,15 @@ # # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Finance Sector Ontology (gUFO re-base)"@en ; rdfs:label "Solid Finance Sector Ontology"@en ; vann:preferredNamespacePrefix "fin" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/finance#" ; - owl:imports , - ; - owl:versionInfo "1.2.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/finance#" ; + owl:imports , + ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """Personal-finance terms (accounts, transactions, holdings, payments) for the EDMA lending/banking use cases, re-based onto the gUFO Solid Core. Account=Relator(+Phase status); transactions/payments @@ -79,8 +79,8 @@ CapNote's capital calls & distributions, and fin:sharePct (the honest percentage datatype replacing Keystone's range-violating bare-literal qudt:quantityValue) + fin:jurisdiction. Generic double-entry + PE terms, - aligned to FIBO Mode-A (finance-alignments.ttl); no existing term changed."""@en ; - dcterms:modified "2026-07-03"^^xsd:date ; + aligned to FIBO Mode-A (finance-alignments.ttl); no existing term changed. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2. v1.2.0 ADDITIVE: double-entry ledger (Keystone) + private-equity capital-calls/distributions (CapNote) + fin:sharePct/jurisdiction. See the revenue-products ontology review §4–§5."@en . # ----------------------------------------------------------------------------- @@ -688,13 +688,13 @@ fin:jurisdiction a owl:DatatypeProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Finance sector"@en ; rdfs:comment "The Finance data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over finance data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Finance"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/futures-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/futures-alignments.ttl index f38b6b2f4..4f45a81ca 100644 --- a/packages/solid-federation-vocab/docs/sectors/futures-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/futures-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Fable 5 (PSS agent) # -@prefix fut: . -@prefix core: . +@prefix fut: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix rdf: . @@ -50,10 +50,12 @@ # Recommendation-track, referenced by their published term IRIs. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Futures sector — external alignments"@en ; - owl:imports ; - owl:versionInfo "0.2.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; rdfs:comment "Optional Mode-A bridge: ActivityStreams 2.0 reaction/event terms, PROV-O activity framing, ODRL 2.2 profiled actions, VC 2.0 credential class, the shared task model's wf: terms, and scheme-level literature anchors for the Max-Neef and Schwartz seeds. External IRIs are real and governed by their bodies. Nothing is owl:imported into the reasoned closure. v0.2.0 adds the fedreg: anchors for the adoption machinery."@en . dcterms:title a owl:AnnotationProperty . @@ -117,8 +119,8 @@ fut:implementationTracker rdfs:seeAlso wf:Tracker . # storage-description resource the claim is re-checked against. Annotation # only (rdfs:seeAlso) — fedreg: is not owl:imported into the reasoned closure. # ----------------------------------------------------------------------------- -fut:AdoptionObservation rdfs:seeAlso . -fut:observationSource rdfs:seeAlso . +fut:AdoptionObservation rdfs:seeAlso . +fut:observationSource rdfs:seeAlso . # ----------------------------------------------------------------------------- # LITERATURE ANCHORS — scheme level only (see header note). diff --git a/packages/solid-federation-vocab/docs/sectors/futures-context.jsonld b/packages/solid-federation-vocab/docs/sectors/futures-context.jsonld index 0b6caefff..0f46b90eb 100644 --- a/packages/solid-federation-vocab/docs/sectors/futures-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/futures-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "fut": "https://w3id.org/jeswr/sectors/futures#", + "fut": "https://jeswr.org/ns/sectors/futures#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/sectors/futures.html b/packages/solid-federation-vocab/docs/sectors/futures.html index 7a5e3b02d..7b467c0f4 100644 --- a/packages/solid-federation-vocab/docs/sectors/futures.html +++ b/packages/solid-federation-vocab/docs/sectors/futures.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/futures# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/futures# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/futures#

+

https://jeswr.org/ns/sectors/futures#

Prefix fut: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/futures.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/futures.shacl.ttl index 3c9e24d50..3c196286a 100644 --- a/packages/solid-federation-vocab/docs/sectors/futures.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/futures.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Fable 5 (PSS agent) # -@prefix fut: . -@prefix fsh: . -@prefix core: . +@prefix fut: . +@prefix fsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -76,46 +76,46 @@ # compose prompt). # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Futures data-model profile (version-independent)"@en ; - dcterms:hasVersion , - ; + dcterms:hasVersion , + ; dcterms:description "Resolves to the current Futures sector profile version (latest: 0.2.0)."@en . - + a prof:Profile ; dcterms:title "Solid Futures data-model profile"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "0.1.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-futures-0.1.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for the futures sector; the version implementations pin via fedreg:acceptsSpec."@en . - + a prof:Profile ; dcterms:title "Solid Futures data-model profile 0.2.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "0.2.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-futures-0.2.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "IMMUTABLE version IRI. ADDITIVE over 0.1.0 (the unite S1 futures-0.2.0 draft, formalised): the scope-B InfraProposal + AdoptionDecision/AdoptionObservation shapes, the Convergence-Room Critique shape, and the methodProvenance / indirectStakeholders constraints. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD."@en . diff --git a/packages/solid-federation-vocab/docs/sectors/futures.ttl b/packages/solid-federation-vocab/docs/sectors/futures.ttl index b8cfec940..3a2885adb 100644 --- a/packages/solid-federation-vocab/docs/sectors/futures.ttl +++ b/packages/solid-federation-vocab/docs/sectors/futures.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Fable 5 (PSS agent) # -@prefix fut: . -@prefix core: . +@prefix fut: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -67,7 +67,7 @@ # them without a coordinated unite migration (fedreg:acceptsSpec is the # migration substrate). # -# NAMESPACE GOVERNANCE (design/01 note): seeding under w3id.org/jeswr mirrors +# NAMESPACE GOVERNANCE (design/01 note): seeding under jeswr.org/ns mirrors # how every sector bootstrapped, but unite's design/04 specifies a migration # path to a steward-circle-governed namespace once adoption warrants it — # hence the 0.x version line (now 0.2.0), not 1.0.0. @@ -81,14 +81,14 @@ # in axioms are declared as punned owl terms. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Futures Sector Ontology"@en ; rdfs:label "Solid Futures Sector Ontology"@en ; vann:preferredNamespacePrefix "fut" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/futures#" ; - owl:imports ; - owl:versionInfo "0.2.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/futures#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The participatory-democracy / shared-futures deliberation data sector for the unite platform (jeswr/unite): expression-layer statements (life context, vision, claim, need, @@ -111,8 +111,8 @@ critique unit (fut:Critique) + the VSD prompt (fut:indirectStakeholders). No 0.1.0 term changed; fut:onStatement's rdfs:domain was WIDENED (removed) because Critique reuses it — the - section-6 multi-class-property rule."""@en ; - dcterms:modified "2026-07-04"^^xsd:date ; + section-6 multi-class-property rule. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Sector ontology for unite Stage-1 (design/01-data-model.md). Version 0.2.0 is the ADDITIVE delta unite's S1 build drafted (its ratification is the first scope-B deliberation — unite SCOPE-DIFFERENTIATION §3.1 B4); the namespace-governance migration to a steward-circle namespace remains a documented follow-on (unite design/04), carried by fedreg:acceptsSpec dual-advertisement."@en . # ----------------------------------------------------------------------------- @@ -964,9 +964,9 @@ fut:kThreshold a odrl:LeftOperand, skos:Concept ; # skos:Concept in the federation sector register; dereferences to this ontology. # ============================================================================= - + a skos:Concept ; rdfs:label "Futures sector"@en ; rdfs:comment "The Futures (participatory-democracy / shared-futures deliberation) data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over deliberation data — the sector the unite platform declares. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Futures"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/health-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/health-alignments.ttl index da8100533..2acf537de 100644 --- a/packages/solid-federation-vocab/docs/sectors/health-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/health-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix health: . -@prefix core: . +@prefix health: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix rdf: . @@ -52,10 +52,12 @@ # FHIR since fhir.ttl is not imported and its axioms are not in the closure). # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Health Sector Ontology — external alignments (gUFO re-base)"@en ; - owl:imports ; - owl:versionInfo "1.0.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; rdfs:comment "Optional Mode-A bridge to FHIR R4/R5, SNOMED CT, LOINC + Mode-B QUDT/UCUM unit binding + IDMP-O. External IRIs are real and subject to their bodies' governance. fhir.ttl is deliberately NOT imported."@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/docs/sectors/health-context.jsonld b/packages/solid-federation-vocab/docs/sectors/health-context.jsonld index 03501e8c6..2b9566c6d 100644 --- a/packages/solid-federation-vocab/docs/sectors/health-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/health-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "health": "https://w3id.org/jeswr/sectors/health#", + "health": "https://jeswr.org/ns/sectors/health#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/sectors/health.html b/packages/solid-federation-vocab/docs/sectors/health.html index dea92d6be..37a4ffe13 100644 --- a/packages/solid-federation-vocab/docs/sectors/health.html +++ b/packages/solid-federation-vocab/docs/sectors/health.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/health# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/health# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/health#

+

https://jeswr.org/ns/sectors/health#

Prefix health: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/health.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/health.shacl.ttl index 338465c0d..6570be6b9 100644 --- a/packages/solid-federation-vocab/docs/sectors/health.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/health.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix health: . -@prefix hsh: . -@prefix core: . +@prefix health: . +@prefix hsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -32,26 +32,26 @@ # v1.0.0 tracks the gUFO re-base of health.ttl. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Health data-model profile (version-independent)"@en ; dcterms:description "Resolves to the current Health profile version."@en . - + a prof:Profile ; dcterms:title "Solid Health data-model profile (gUFO re-base)"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-health-1.0.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile, MUST/SHOULD grades derived from FHIR R4/R5 StructureDefinitions. "@en . diff --git a/packages/solid-federation-vocab/docs/sectors/health.ttl b/packages/solid-federation-vocab/docs/sectors/health.ttl index 3a40c6653..82115fa26 100644 --- a/packages/solid-federation-vocab/docs/sectors/health.ttl +++ b/packages/solid-federation-vocab/docs/sectors/health.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix health: . -@prefix core: . +@prefix health: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -59,15 +59,15 @@ # # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Health Sector Ontology (gUFO re-base)"@en ; rdfs:label "Solid Health Sector Ontology"@en ; vann:preferredNamespacePrefix "health" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/health#" ; - owl:imports , - ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/health#" ; + owl:imports , + ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """Personal health records for the apple-health-import app and the EDMA patient-records use case, re-based onto the gUFO Solid Core. Patient=RoleMixin of core:Person; observations/conditions/medication- @@ -76,8 +76,8 @@ the Apple Health types) carry a value + a QUDT/UCUM unit. Aligns to FHIR R4/R5 (Mode A, no fhir.ttl import) and SNOMED CT / LOINC concept IRIs in the companion health-alignments.ttl; reuses QUDT for units via a slim - Mode-B module. v1.0.0 is a BREAKING re-base of v0."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + Mode-B module. v1.0.0 is a BREAKING re-base of v0. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2 (HEALTH row)."@en . # ----------------------------------------------------------------------------- @@ -326,13 +326,13 @@ health:resultsIn a owl:ObjectProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Health sector"@en ; rdfs:comment "The Health data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over health data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Health"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/health/diet-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/health/diet-alignments.ttl index 327767076..476ccd75a 100644 --- a/packages/solid-federation-vocab/docs/sectors/health/diet-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/health/diet-alignments.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix diet: . -@prefix health: . -@prefix core: . +@prefix diet: . +@prefix health: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix rdf: . @@ -41,10 +41,12 @@ # app's exposure derivation actually reads). # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Health Diet sub-sector — external alignments"@en ; - owl:imports ; - owl:versionInfo "1.0.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; rdfs:comment "Optional Mode-A bridge: schema.org food/meal terms, SNOMED CT + LOINC symptom concepts, ChEBI + Monash-FODMAP trigger substances, and Open Food Facts allergen/additive taxonomy. External IRIs are real and governed by their bodies. Nothing is owl:imported into the reasoned closure."@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/docs/sectors/health/diet-context.jsonld b/packages/solid-federation-vocab/docs/sectors/health/diet-context.jsonld index 34f5ee7f2..d4533ad06 100644 --- a/packages/solid-federation-vocab/docs/sectors/health/diet-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/health/diet-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "diet": "https://w3id.org/jeswr/sectors/health/diet#", + "diet": "https://jeswr.org/ns/sectors/health/diet#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/sectors/health/diet.html b/packages/solid-federation-vocab/docs/sectors/health/diet.html index 1eb28220b..f9331e961 100644 --- a/packages/solid-federation-vocab/docs/sectors/health/diet.html +++ b/packages/solid-federation-vocab/docs/sectors/health/diet.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/health/diet# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/health/diet# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/health/diet#

+

https://jeswr.org/ns/sectors/health/diet#

Prefix diet: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/health/diet.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/health/diet.shacl.ttl index d6f926f19..47cd0b966 100644 --- a/packages/solid-federation-vocab/docs/sectors/health/diet.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/health/diet.shacl.ttl @@ -1,9 +1,9 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix diet: . -@prefix dsh: . -@prefix health: . -@prefix core: . +@prefix diet: . +@prefix dsh: . +@prefix health: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -42,26 +42,26 @@ # cannot assert the ABSENCE of an undefined property, so it is a design note here. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Health Diet data-model profile (version-independent)"@en ; dcterms:description "Resolves to the current Diet sub-sector profile version."@en . - + a prof:Profile ; dcterms:title "Solid Health Diet data-model profile"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-health-diet-1.0.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for the diet sub-sector; MUSTs follow the 'what + when' frictionless-logging rule."@en . diff --git a/packages/solid-federation-vocab/docs/sectors/health/diet.ttl b/packages/solid-federation-vocab/docs/sectors/health/diet.ttl index db5d43149..32ad9743f 100644 --- a/packages/solid-federation-vocab/docs/sectors/health/diet.ttl +++ b/packages/solid-federation-vocab/docs/sectors/health/diet.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix diet: . -@prefix health: . -@prefix core: . +@prefix diet: . +@prefix health: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -61,15 +61,15 @@ # external terms referenced in axioms are declared as punned owl terms. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Health Diet sub-sector Ontology"@en ; rdfs:label "Solid Health Diet sub-sector Ontology"@en ; vann:preferredNamespacePrefix "diet" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/health/diet#" ; - owl:imports , - ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/health/diet#" ; + owl:imports , + ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The nutrition & multi-intolerance food-diary domain for the coeliac & multi-intolerance app (@jeswr/solid-health-diary): meals and food items (with Open Food Facts allergen/trace/additive/category tags), @@ -79,8 +79,8 @@ conclusions, on-device-summarised HLA-DQ genetics, and the working diet plan. A sub-sector of the health sector; aligns Mode-A to schema.org FoodEvent/NutritionInformation, SNOMED CT / LOINC symptom concepts and FODMAP - concepts in diet-alignments.ttl."""@en ; - dcterms:modified "2026-07-03"^^xsd:date ; + concepts in diet-alignments.ttl. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Sub-sector of the health sector (sectors/health). Decision support, not diagnosis — the app never asserts a disease; that framing is carried in the confidence + interpretation data."@en . # ----------------------------------------------------------------------------- @@ -904,10 +904,10 @@ diet:clinicalReport a diet:GeneticSourceType, skos:Concept ; # to this ontology. # ============================================================================= - + a skos:Concept ; rdfs:label "Diet sub-sector"@en ; rdfs:comment "The Diet (nutrition / food-intolerance) sub-sector of the Health sector. The value a food-diary app's fedapp:sector names in its Client Identifier Document. Backed by this sub-sector ontology; narrower than the Health sector."@en ; - rdfs:isDefinedBy ; - skos:broader ; + rdfs:isDefinedBy ; + skos:broader ; skos:prefLabel "Diet"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/identity-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/identity-alignments.ttl index d4edcda03..530867beb 100644 --- a/packages/solid-federation-vocab/docs/sectors/identity-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/identity-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix id: . -@prefix core: . +@prefix id: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -40,11 +40,12 @@ # collapse two distinct Core classes (contract §3). # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; dcterms:title "Solid Identity & Profile — external alignments (gUFO re-base)"@en ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to vcard / schema.org / ISO 3166 / eIDAS 2.0 PID. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/docs/sectors/identity.html b/packages/solid-federation-vocab/docs/sectors/identity.html index e313e2812..da32c883a 100644 --- a/packages/solid-federation-vocab/docs/sectors/identity.html +++ b/packages/solid-federation-vocab/docs/sectors/identity.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/identity# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/identity# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/identity#

+

https://jeswr.org/ns/sectors/identity#

Prefix id: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/identity.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/identity.shacl.ttl index 5ebb7d6a9..eb4de8bc2 100644 --- a/packages/solid-federation-vocab/docs/sectors/identity.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/identity.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix idsh: . -@prefix id: . -@prefix core: . +@prefix idsh: . +@prefix id: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -24,17 +24,17 @@ # v1.0.0 tracks the gUFO re-base of identity.ttl. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Identity & Profile data-model profile (gUFO re-base)"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "identity-1.0.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for identity & verified-claim data, re-based onto the gUFO Core. "@en . diff --git a/packages/solid-federation-vocab/docs/sectors/identity.ttl b/packages/solid-federation-vocab/docs/sectors/identity.ttl index 33f832d35..f85405c76 100644 --- a/packages/solid-federation-vocab/docs/sectors/identity.ttl +++ b/packages/solid-federation-vocab/docs/sectors/identity.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix id: . -@prefix core: . +@prefix id: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -40,14 +40,14 @@ # Open-world by default; the SHACL profile carries the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Identity & Profile Ontology (gUFO re-base)"@en ; rdfs:label "Solid Identity & Profile Ontology"@en ; vann:preferredNamespacePrefix "id" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/identity#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/identity#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """Personal identity & profile attributes for KYC reuse, tell-us-once, and verified claims, re-based onto the gUFO Core. Roots in core:Person (NaturalPerson SubKind), core:Identifier (the identifier @@ -56,8 +56,8 @@ structure as global abstract slots (§3.5) — no canonical 'the gender'. v1.0.0 is a BREAKING re-base of v0 (the meta-types change meaning), so a new MAJOR version. Aligns to vcard, schema:Person, ISO 3166 and the - eIDAS 2.0 PID attribute set in the companion alignments file."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + eIDAS 2.0 PID attribute set in the companion alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2/§3.5."@en . # ----------------------------------------------------------------------------- @@ -336,13 +336,13 @@ id:Pronouns a owl:Class, gufo:Kind ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Identity & Profile sector"@en ; rdfs:comment "The Identity & Profile data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over identity & profile data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Identity & Profile"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/media-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/media-alignments.ttl index cbdc6b235..b47092387 100644 --- a/packages/solid-federation-vocab/docs/sectors/media-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/media-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix media: . -@prefix core: . +@prefix media: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -30,11 +30,12 @@ # media: never silently inherits schema.org's commitments. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; dcterms:title "Solid Media & Activity — external alignments (gUFO re-base)"@en ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to schema.org + a conceptual ODRL tie. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/docs/sectors/media-context.jsonld b/packages/solid-federation-vocab/docs/sectors/media-context.jsonld index 3915fcd0d..67b594a9d 100644 --- a/packages/solid-federation-vocab/docs/sectors/media-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/media-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "media": "https://w3id.org/jeswr/sectors/media#", + "media": "https://jeswr.org/ns/sectors/media#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/sectors/media.html b/packages/solid-federation-vocab/docs/sectors/media.html index 4a9395f37..b4a0fd7a4 100644 --- a/packages/solid-federation-vocab/docs/sectors/media.html +++ b/packages/solid-federation-vocab/docs/sectors/media.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/media# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/media# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/media#

+

https://jeswr.org/ns/sectors/media#

Prefix media: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/media.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/media.shacl.ttl index 3c0549c21..563659921 100644 --- a/packages/solid-federation-vocab/docs/sectors/media.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/media.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix mdsh: . -@prefix media: . -@prefix core: . +@prefix mdsh: . +@prefix media: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -25,17 +25,17 @@ # v1.0.0 tracks the gUFO re-base of media.ttl. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Media & Activity data-model profile (gUFO re-base)"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "media-1.0.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for media works, playback events and listening history, re-based onto the gUFO Core. "@en . diff --git a/packages/solid-federation-vocab/docs/sectors/media.ttl b/packages/solid-federation-vocab/docs/sectors/media.ttl index 958b4241b..f22fbc761 100644 --- a/packages/solid-federation-vocab/docs/sectors/media.ttl +++ b/packages/solid-federation-vocab/docs/sectors/media.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix media: . -@prefix core: . +@prefix media: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -11,7 +11,7 @@ @prefix vann: . @prefix gufo: . @prefix foaf: . -@prefix fedgen: . +@prefix fedgen: . # ============================================================================= # Solid Media & Activity sector ontology — RE-BASED onto gUFO (KEY=media). @@ -53,14 +53,14 @@ # endurant-domain media:recordingOf is rooted in core:about. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Media & Activity Ontology (gUFO re-base)"@en ; rdfs:label "Solid Media & Activity Ontology"@en ; vann:preferredNamespacePrefix "media" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/media#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/media#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """Media consumption & creative works — the Spotify end-to-end example and the media importers — re-based onto the gUFO Core. Roots in core:InformationResource/core:Asset (creative works), @@ -70,8 +70,8 @@ (the usage licence). v1.0.0 is a BREAKING re-base of v0 (the meta-types change meaning), so a new MAJOR version. Aligns to schema.org CreativeWork/MusicRecording/MusicGroup/Event and ODRL in the companion - alignments file."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2."@en . # ----------------------------------------------------------------------------- @@ -342,13 +342,13 @@ media:loved a owl:DatatypeProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Media & Activity sector"@en ; rdfs:comment "The Media & Activity data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over media & activity data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Media & Activity"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/scheduling-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/scheduling-alignments.ttl index e1ed85ef6..a1cc3b84c 100644 --- a/packages/solid-federation-vocab/docs/sectors/scheduling-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/scheduling-alignments.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -35,12 +35,13 @@ # default to closeMatch — the conservative seam that keeps Core∪Sector clean. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; dcterms:title "Solid Scheduling — external alignments (gUFO re-base)"@en ; - owl:imports ; - owl:versionInfo "1.1.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; dcterms:modified "2026-10-25"^^xsd:date ; - owl:versionIRI ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to iCalendar (RFC 5545 / W3C cal:), schema.org and W3C OWL-Time. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld b/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld index 3641e66a4..08bf3ed0e 100644 --- a/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/scheduling-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "sched": "https://w3id.org/jeswr/sectors/scheduling#", + "sched": "https://jeswr.org/ns/sectors/scheduling#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/sectors/scheduling.html b/packages/solid-federation-vocab/docs/sectors/scheduling.html index d7d188848..3fa17e774 100644 --- a/packages/solid-federation-vocab/docs/sectors/scheduling.html +++ b/packages/solid-federation-vocab/docs/sectors/scheduling.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/scheduling# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/scheduling# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/scheduling#

+

https://jeswr.org/ns/sectors/scheduling#

Prefix sched: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/scheduling.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/scheduling.shacl.ttl index e8015cf1e..cbcc48428 100644 --- a/packages/solid-federation-vocab/docs/sectors/scheduling.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/scheduling.shacl.ttl @@ -1,10 +1,10 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix schsh: . -@prefix sched: . +@prefix schsh: . +@prefix sched: . @prefix schema: . -@prefix core: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -26,18 +26,18 @@ # v1.1.0 adds all-day dates and schema.org recurrence selectors. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Scheduling data-model profile (gUFO re-base)"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.1.0" ; dcterms:modified "2026-10-25"^^xsd:date ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "scheduling-1.1.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for calendar/scheduling data, re-based onto the gUFO Core. Validates CalendarEvent, Task, Calendar, Attendance, RecurrenceRule and Reminder. "@en . diff --git a/packages/solid-federation-vocab/docs/sectors/scheduling.ttl b/packages/solid-federation-vocab/docs/sectors/scheduling.ttl index 03822ebb6..462973468 100644 --- a/packages/solid-federation-vocab/docs/sectors/scheduling.ttl +++ b/packages/solid-federation-vocab/docs/sectors/scheduling.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -49,14 +49,14 @@ # Open-world by default; the SHACL profile carries the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Scheduling Ontology (gUFO re-base)"@en ; rdfs:label "Solid Scheduling Ontology"@en ; vann:preferredNamespacePrefix "sched" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/scheduling#" ; - owl:imports ; - owl:versionInfo "1.1.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/scheduling#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """Calendars and scheduling (the Calendar app), re-based onto the gUFO Core. Roots CalendarEvent in core:Event, Task/ToDo in core:Activity, Calendar/RecurrenceRule/Reminder in core:InformationResource @@ -66,7 +66,7 @@ hadParticipant). v1.0.0 is a BREAKING re-base of v0 (the meta-types change meaning, and the v0 string-role relationship is replaced by a relator), so a new MAJOR version. Aligns to iCalendar RFC 5545, schema:Event/Schedule - and W3C OWL-Time in the companion alignments file."""@en ; + and W3C OWL-Time in the companion alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2. v1.1.0 allows date or dateTime for entry start/end/due and recurrence until; date values mean all-day. The companion SHACL profile adds schema.org recurrence selectors."@en . @@ -385,13 +385,13 @@ sched:triggerOffset a owl:DatatypeProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Scheduling sector"@en ; rdfs:comment "The Scheduling data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over scheduling data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Scheduling"@en . diff --git a/packages/solid-federation-vocab/docs/sectors/social-alignments.ttl b/packages/solid-federation-vocab/docs/sectors/social-alignments.ttl index fc269a27a..dd5213ed9 100644 --- a/packages/solid-federation-vocab/docs/sectors/social-alignments.ttl +++ b/packages/solid-federation-vocab/docs/sectors/social-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix social: . -@prefix core: . +@prefix social: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -30,9 +30,12 @@ # same social:Note shape chat-interop reconciles. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Solid Social Sector Ontology — AS2 + SIOC + schema.org Mode-A alignments"@en ; - owl:imports ; + owl:imports ; rdfs:comment "Annotation-only (skos:*Match) bridges to ActivityStreams 2.0, SIOC and schema.org — the @jeswr/solid-chat-interop CanonicalMessage content model. No entailment. "@en . # --- Note <-> as:Note / sioc:Note (the canonical message/feed-item shape) --- diff --git a/packages/solid-federation-vocab/docs/sectors/social-context.jsonld b/packages/solid-federation-vocab/docs/sectors/social-context.jsonld index 0df034667..52b4a190e 100644 --- a/packages/solid-federation-vocab/docs/sectors/social-context.jsonld +++ b/packages/solid-federation-vocab/docs/sectors/social-context.jsonld @@ -2,7 +2,7 @@ "@context": { "@version": 1.1, "@protected": true, - "social": "https://w3id.org/jeswr/sectors/social#", + "social": "https://jeswr.org/ns/sectors/social#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "skos": "http://www.w3.org/2004/02/skos/core#", "xsd": "http://www.w3.org/2001/XMLSchema#", diff --git a/packages/solid-federation-vocab/docs/sectors/social.html b/packages/solid-federation-vocab/docs/sectors/social.html index 243e994db..9d6eb2e79 100644 --- a/packages/solid-federation-vocab/docs/sectors/social.html +++ b/packages/solid-federation-vocab/docs/sectors/social.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/sectors/social# — Solid Federation Sector Ontology + jeswr.org/ns/sectors/social# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/sectors/social#

+

https://jeswr.org/ns/sectors/social#

Prefix social: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

diff --git a/packages/solid-federation-vocab/docs/sectors/social.shacl.ttl b/packages/solid-federation-vocab/docs/sectors/social.shacl.ttl index 3ecf9e42f..d9b2a1ca1 100644 --- a/packages/solid-federation-vocab/docs/sectors/social.shacl.ttl +++ b/packages/solid-federation-vocab/docs/sectors/social.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix social: . -@prefix socsh: . -@prefix core: . +@prefix social: . +@prefix socsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -19,16 +19,16 @@ # Warning=SHOULD, Info=MAY); IMMUTABLE version IRI; additive. # ============================================================================= - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Social data-model profile (version-independent)"@en ; - dcterms:hasVersion ; + dcterms:hasVersion ; rdfs:comment "Version-independent IRI resolving to the current Social profile. "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Social data-model profile 1.0.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "social-1.0.0" ; rdfs:comment "IMMUTABLE version IRI. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . diff --git a/packages/solid-federation-vocab/docs/sectors/social.ttl b/packages/solid-federation-vocab/docs/sectors/social.ttl index 1afb6da3f..9092125c3 100644 --- a/packages/solid-federation-vocab/docs/sectors/social.ttl +++ b/packages/solid-federation-vocab/docs/sectors/social.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix social: . -@prefix core: . +@prefix social: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -21,7 +21,7 @@ # # THIS SECTOR ALSO REPAIRS A DANGLING REFERENCE: @jeswr/pod-chat's # clientid.jsonld already names fedapp:sector -# , which until now did not resolve +# , which until now did not resolve # (the sector was flagged "not yet authored" in the README). Authoring it here # fixes that reference. # @@ -40,14 +40,14 @@ # the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Social, Fediverse & Feed Sector Ontology"@en ; rdfs:label "Solid Social, Fediverse & Feed Sector Ontology"@en ; vann:preferredNamespacePrefix "social" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/social#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/social#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The social / fediverse / feed data sector — the domain a federated Elk (Mastodon/ActivityPub) client, a Miniflux (RSS/Atom) reader, and @jeswr/pod-chat operate in. Authors the sector marker and gUFO-rooted @@ -56,8 +56,8 @@ spine. Built on ActivityStreams 2.0 (as:Note/as:Collection) + SIOC and aligned to @jeswr/solid-chat-interop's CanonicalMessage (whose content model is AS2) in the companion alignments file. Authoring this sector also repairs - the dangling fedapp:sector reference in @jeswr/pod-chat's clientid."""@en ; - dcterms:modified "2026-06-21"^^xsd:date ; + the dangling fedapp:sector reference in @jeswr/pod-chat's clientid. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Foundation sector for the 5-OSS-fork initiative (Elk + Miniflux); repairs the pod-chat dangling reference."@en . # ----------------------------------------------------------------------------- @@ -146,14 +146,14 @@ social:published a owl:DatatypeProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. THIS is the IRI # @jeswr/pod-chat's clientid.jsonld already references. # ============================================================================= - + a ; rdfs:label "Social, Fediverse & Feed sector"@en ; rdfs:comment "The Social, Fediverse & Feed data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over social / fediverse / feed data (toots, posts, chat messages, RSS entries). Backed by this sector ontology. Already referenced by @jeswr/pod-chat's clientid."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Social, Fediverse & Feed"@en . diff --git a/packages/solid-federation-vocab/docs/task-context.jsonld b/packages/solid-federation-vocab/docs/task-context.jsonld index 96f98ed84..8306e22dc 100644 --- a/packages/solid-federation-vocab/docs/task-context.jsonld +++ b/packages/solid-federation-vocab/docs/task-context.jsonld @@ -3,7 +3,7 @@ "@version": 1.1, "@protected": true, - "tm": "https://w3id.org/jeswr/task#", + "tm": "https://jeswr.org/ns/task#", "wf": "http://www.w3.org/2005/01/wf/flow#", "dct": "http://purl.org/dc/terms/", "as": "https://www.w3.org/ns/activitystreams#", diff --git a/packages/solid-federation-vocab/docs/task.html b/packages/solid-federation-vocab/docs/task.html index 9ac666845..ab652eefa 100644 --- a/packages/solid-federation-vocab/docs/task.html +++ b/packages/solid-federation-vocab/docs/task.html @@ -4,7 +4,7 @@ - w3id.org/jeswr/task — Solid Federation Vocabulary + jeswr.org/ns/task — Solid Federation Vocabulary -

https://w3id.org/jeswr/task#

+

https://jeswr.org/ns/task#

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

Terms

diff --git a/packages/solid-federation-vocab/docs/task.ttl b/packages/solid-federation-vocab/docs/task.ttl index 0a45d5dba..cf8ca5fea 100644 --- a/packages/solid-federation-vocab/docs/task.ttl +++ b/packages/solid-federation-vocab/docs/task.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # # Shared Cross-App Task / Issue Model (the federation task vocabulary) -# Namespace: https://w3id.org/jeswr/task# (ADR-0013; beads pss-tof + pss-74i) +# Namespace: https://jeswr.org/ns/task# (ADR-0013; beads pss-tof + pss-74i) # # This is NOT a new ontology of task terms — it is the canonical, dereferenceable # RE-USE of established vocabularies (the SolidOS W3C workflow ontology `wf:`, @@ -12,7 +12,7 @@ # that agreement so the @context (task-context.jsonld) has a stable home and the # shared terms resolve. -@prefix tm: . +@prefix tm: . @prefix wf: . @prefix dct: . @prefix as: . @@ -23,8 +23,9 @@ @prefix vann: . @prefix xsd: . - - a owl:Ontology ; + a owl:Ontology ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dct:title "Shared Cross-App Task / Issue Model"@en ; dct:description """The canonical, dereferenceable re-use of the W3C workflow ontology (wf:), Dublin Core Terms (dct:) and ActivityStreams 2.0 (as:) @@ -36,13 +37,13 @@ a wf:State), and an event-condition-action automation model (tm:Rule + tm:trigger / tm:condition / tm:action) for client-evaluated 'when X then Y' tracker rules, reusing odrl:Constraint for the - condition."""@en ; + condition. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; dct:creator "Claude Opus 4.8 (@jeswr PSS agent)" ; dct:issued "2026-06-15"^^xsd:date ; - dct:modified "2026-06-17"^^xsd:date ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/task#" ; + dct:modified "2026-10-25"^^xsd:date ; + vann:preferredNamespaceUri "https://jeswr.org/ns/task#" ; vann:preferredNamespacePrefix "tm" ; - rdfs:seeAlso ; + rdfs:seeAlso ; rdfs:comment "Experimental — AI-agent-generated; under active development, not production-hardened."@en . # --------------------------------------------------------------------------- @@ -132,7 +133,7 @@ tm:wipMin no lower bound. A non-negative integer."""@en ; rdfs:domain wf:State ; rdfs:range xsd:nonNegativeInteger ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:wipMax a rdf:Property, owl:DatatypeProperty ; @@ -146,7 +147,7 @@ tm:wipMax integer."""@en ; rdfs:domain wf:State ; rdfs:range xsd:nonNegativeInteger ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . # =========================================================================== # tm: extension 2 — automation rules: event-condition-action ("when X then Y") @@ -176,7 +177,7 @@ tm:Rule Rules are persisted in the pod and evaluated CLIENT-side whenever fresh issue state is observed (pods have no server-side compute). The Jira/Monday automation model expressed in RDF."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:Trigger a rdfs:Class, owl:Class ; @@ -186,7 +187,7 @@ tm:Trigger tm:OnDueDatePassed, tm:OnAllSubtasksDone, tm:OnAssigned, tm:OnCreated. A trigger may carry refining data (e.g. the target status of a status-change) on app-defined properties; the coded value identifies the event class."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:Action a rdfs:Class, owl:Class ; @@ -197,7 +198,7 @@ tm:Action tm:AddComment, tm:CloseIssue. An action carries its parameter via tm:actionValue (e.g. the priority to set, the status slug, the assignee WebID, the comment body). The mutation is applied client-side."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:rule a rdf:Property, owl:ObjectProperty ; @@ -206,7 +207,7 @@ tm:rule set of rules a tracker's collaborators evaluate client-side."""@en ; rdfs:domain wf:Tracker ; rdfs:range tm:Rule ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:trigger a rdf:Property, owl:ObjectProperty ; @@ -217,7 +218,7 @@ tm:trigger rule."""@en ; rdfs:domain tm:Rule ; rdfs:range tm:Trigger ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:condition a rdf:Property, owl:ObjectProperty ; @@ -230,7 +231,7 @@ tm:condition with no condition fires whenever its trigger fires)."""@en ; rdfs:domain tm:Rule ; rdfs:range odrl:Constraint ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:action a rdf:Property, owl:ObjectProperty ; @@ -241,7 +242,7 @@ tm:action rule may carry several actions, all applied client-side."""@en ; rdfs:domain tm:Rule ; rdfs:range tm:Action ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:actionValue a rdf:Property ; @@ -253,7 +254,7 @@ tm:actionValue rdfs:range so it can hold either. Some actions (e.g. tm:CloseIssue) need no value."""@en ; rdfs:domain tm:Action ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . # --- coded-value triggers (instances of tm:Trigger) ------------------------- @@ -263,14 +264,14 @@ tm:OnStatusChange rdfs:comment """Trigger: an issue's workflow status changed. Pair with a tm:condition over the new status (an odrl:Constraint whose left-operand is the issue's status) to fire only on a specific transition."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:OnDueDatePassed a tm:Trigger ; rdfs:label "on due date passed"@en ; rdfs:comment """Trigger: an open issue's due date has passed (it is overdue). The basis for the built-in 'escalate overdue issues' automation."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:OnAllSubtasksDone a tm:Trigger ; @@ -278,19 +279,19 @@ tm:OnAllSubtasksDone rdfs:comment """Trigger: every sub-task of a parent issue has reached a terminal (closed) state. The basis for the built-in 'complete parents automatically' automation."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:OnAssigned a tm:Trigger ; rdfs:label "on assigned"@en ; rdfs:comment """Trigger: an issue was (re)assigned (its wf:assignee changed)."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:OnCreated a tm:Trigger ; rdfs:label "on created"@en ; rdfs:comment """Trigger: a new issue was created in the tracker."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . # --- coded-value actions (instances of tm:Action) --------------------------- @@ -299,35 +300,35 @@ tm:SetStatus rdfs:label "set status"@en ; rdfs:comment """Action: move the issue to a workflow status. The target status slug is carried on tm:actionValue."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:SetPriority a tm:Action ; rdfs:label "set priority"@en ; rdfs:comment """Action: set the issue's priority. The target priority is carried on tm:actionValue (e.g. \"high\")."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:Assign a tm:Action ; rdfs:label "assign"@en ; rdfs:comment """Action: set the issue's wf:assignee. The assignee WebID (an IRI) is carried on tm:actionValue."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:AddComment a tm:Action ; rdfs:label "add comment"@en ; rdfs:comment """Action: add a comment to the issue. The comment body literal is carried on tm:actionValue."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:CloseIssue a tm:Action ; rdfs:label "close issue"@en ; rdfs:comment """Action: close the issue (move it to the workflow's terminal status). Needs no tm:actionValue."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . # --- the re-used ODRL constraint shape (defined by odrl:, restated here) ----- # tm:condition's value is an odrl:Constraint. These are re-used, NOT minted — diff --git a/packages/solid-federation-vocab/fedapp.ttl b/packages/solid-federation-vocab/fedapp.ttl index a33678c4b..9112e8b91 100644 --- a/packages/solid-federation-vocab/fedapp.ttl +++ b/packages/solid-federation-vocab/fedapp.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # # Federation App-Registration Vocabulary (fedapp:) -# Namespace: https://w3id.org/jeswr/fed# (ADR-0013, prod-solid-server) +# Namespace: https://jeswr.org/ns/fed# (ADR-0013, prod-solid-server) # # The OpenID-Federation-style metadata a Solid app publishes IN its Client # Identifier Document (the .jsonld served at the app's client_id URL). It lets a @@ -13,7 +13,7 @@ # Authored as Turtle directly (source form); machine-built RDF in this repo goes # through n3.Writer / @rdfjs/wrapper typed accessors — never hand-built quads. -@prefix fedapp: . +@prefix fedapp: . @prefix rdf: . @prefix rdfs: . @prefix owl: . @@ -25,18 +25,19 @@ # Ontology ################################################################# - - a owl:Ontology ; + a owl:Ontology ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Federation App-Registration Vocabulary"@en ; dcterms:description """OpenID-Federation-style metadata a Solid app publishes in its Client Identifier Document, describing the data sectors it operates in, the access modes it requests, and the shared - shapes it consumes and produces."""@en ; + shapes it consumes and produces. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; dcterms:creator "Claude Opus 4.8 (@jeswr PSS agent)" ; dcterms:issued "2026-06-15"^^xsd:date ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/fed#" ; + vann:preferredNamespaceUri "https://jeswr.org/ns/fed#" ; vann:preferredNamespacePrefix "fedapp" ; - rdfs:seeAlso ; + rdfs:seeAlso ; rdfs:comment "Experimental — AI-agent-generated; under active development, not production-hardened."@en . ################################################################# @@ -51,7 +52,7 @@ fedapp:App typically the app's client_id IRI (its Client Identifier Document). It declares the sectors, access modes and shapes the app works with."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:AppVersion a rdfs:Class, owl:Class ; @@ -59,7 +60,7 @@ fedapp:AppVersion rdfs:comment """A specific released version of an fedapp:App. Lets a registry track behavioural changes (e.g. a newly requested access mode or a new produced shape) across releases of the same client_id."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:SectorUse a rdfs:Class, owl:Class ; @@ -70,7 +71,7 @@ fedapp:SectorUse scoped to it. Use SectorUse when per-sector access differs; for a flat declaration attach fedapp:sector / fedapp:access directly to the App."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . ################################################################# # Properties @@ -92,17 +93,17 @@ fedapp:sectorUse directly to the App instead."""@en ; rdfs:domain fedapp:App ; rdfs:range fedapp:SectorUse ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:sector a rdf:Property, owl:ObjectProperty ; rdfs:label "sector"@en ; rdfs:comment """The data sector operated in (e.g. the identity / productivity / media / finance / health / documents / social - sector IRIs under https://w3id.org/jeswr/sectors/). May be attached to + sector IRIs under https://jeswr.org/ns/sectors/). May be attached to an fedapp:App directly, or to an fedapp:SectorUse node — so it carries no rdfs:domain."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:access a rdf:Property, owl:ObjectProperty ; @@ -113,7 +114,7 @@ fedapp:access granting consent. Attaches to an fedapp:App or an fedapp:SectorUse — so it carries no rdfs:domain."""@en ; rdfs:range ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:consumes a rdf:Property, owl:ObjectProperty ; @@ -123,7 +124,7 @@ fedapp:consumes consumable from the federation. Pairs with fedapp:produces to draw the producer/consumer graph of the ecosystem. Attaches to an fedapp:App or an fedapp:SectorUse — so it carries no rdfs:domain."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:produces a rdf:Property, owl:ObjectProperty ; @@ -133,7 +134,7 @@ fedapp:produces the federation, so consumers can discover where data of that shape originates. Attaches to an fedapp:App or an fedapp:SectorUse — so it carries no rdfs:domain."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedapp:declaresShape a rdf:Property, owl:ObjectProperty ; @@ -144,4 +145,4 @@ fedapp:declaresShape the app is a source-of-truth definer for that shape."""@en ; rdfs:domain fedapp:App ; rdfs:range ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . diff --git a/packages/solid-federation-vocab/fedcon-context.jsonld b/packages/solid-federation-vocab/fedcon-context.jsonld index 574044731..a7ac94c43 100644 --- a/packages/solid-federation-vocab/fedcon-context.jsonld +++ b/packages/solid-federation-vocab/fedcon-context.jsonld @@ -4,7 +4,7 @@ "@protected": true, "fedcon": "https://jeswr.org/fedcon#", - "fedreg": "https://w3id.org/jeswr/fedreg#", + "fedreg": "https://jeswr.org/ns/fedreg#", "oa": "http://www.w3.org/ns/oa#", "prov": "http://www.w3.org/ns/prov#", "dcat": "http://www.w3.org/ns/dcat#", diff --git a/packages/solid-federation-vocab/fedcon.shacl.ttl b/packages/solid-federation-vocab/fedcon.shacl.ttl index 2bdd818c8..5d8dffa72 100644 --- a/packages/solid-federation-vocab/fedcon.shacl.ttl +++ b/packages/solid-federation-vocab/fedcon.shacl.ttl @@ -2,7 +2,7 @@ # @prefix fedcon: . @prefix fcsh: . -@prefix fedreg: . +@prefix fedreg: . @prefix oa: . @prefix prov: . @prefix sh: . @@ -22,7 +22,7 @@ # Info=MAY); IMMUTABLE version IRI; additive. # # Rooted at https://jeswr.org/fedcon/profile (the jeswr.org namespace of fedcon:, -# NOT w3id.org/jeswr like the sector profiles). This is a BEST-EFFORT structural +# NOT jeswr.org/ns like the sector profiles). This is a BEST-EFFORT structural # encoding of the contribution-api-design: several rules (recompute-and-compare # the concept hash, cross-graph "respond to every unresolved Oppose", the # per-registry evidence threshold) are genuinely SERVICE-SIDE and cannot be diff --git a/packages/solid-federation-vocab/fedcon.ttl b/packages/solid-federation-vocab/fedcon.ttl index 2c34b91b3..7e3f23860 100644 --- a/packages/solid-federation-vocab/fedcon.ttl +++ b/packages/solid-federation-vocab/fedcon.ttl @@ -5,8 +5,8 @@ # # The GOVERNANCE / GLUE vocabulary for the concept-federation registry's # contribution + admission lifecycle. It is the WRITE-side companion to the -# DISCOVERY-side fedreg: (https://w3id.org/jeswr/fedreg#) and the SELF-ASSERTED -# fedapp: (https://w3id.org/jeswr/fed#): where fedreg: describes WHO is a member +# DISCOVERY-side fedreg: (https://jeswr.org/ns/fedreg#) and the SELF-ASSERTED +# fedapp: (https://jeswr.org/ns/fed#): where fedreg: describes WHO is a member # and WHICH specs a storage accepts, fedcon: describes HOW a concept crystallises # into a federation — proposed, publicly commented, and admitted (or rejected) by # a registry authority. @@ -29,14 +29,10 @@ # (SHACL-enforced), a direct port of the unite fut:SharedFuture dissent annex — # manufactured consensus is never permitted. # -# NAMESPACE NOTE — https://jeswr.org/fedcon# (NOT w3id.org/jeswr): unlike the -# sibling governance vocabularies (fedapp:/fedreg:/task:/core:/the sectors), which -# are w3id.org-rooted, fedcon: mints under the maintainer's now-live jeswr.org -# domain. This avoids a dependency on the still-pending w3id.org redirect PR for -# NEW work; LIVE resolution of https://jeswr.org/fedcon is a pending jeswr.org -# hosting/DNS decision (out of scope for this vocab-only phase). Cross-namespace -# references (a fedcon: term pointing at a w3id.org fedreg: term, and vice-versa) -# are ordinary RDF and completely fine. +# NAMESPACE NOTE — https://jeswr.org/fedcon# is preserved by DECISIONS V1. +# The sibling fedapp:/fedreg:/task:/core: and sector vocabularies now use +# https://jeswr.org/ns/. References to those siblings follow their new bases; +# fedcon's own ontology identity, term IRIs and version are unchanged. # # REUSE, DON'T REINVENT (the LD/SW house rule): fedcon: mints ONLY the federation # contribution/admission + content-addressed-snapshot glue. Web Annotation (oa:) for @@ -57,7 +53,7 @@ # n3.Writer / @rdfjs/wrapper typed accessors — never hand-built quads. @prefix fedcon: . -@prefix fedreg: . +@prefix fedreg: . @prefix dcat: . @prefix hydra: . @prefix oa: . @@ -88,7 +84,7 @@ dcterms:modified "2026-07-07"^^xsd:date ; vann:preferredNamespaceUri "https://jeswr.org/fedcon#" ; vann:preferredNamespacePrefix "fedcon" ; - rdfs:seeAlso ; + rdfs:seeAlso ; rdfs:comment "Experimental — AI-agent-generated; under active development, not production-hardened."@en . ################################################################# diff --git a/packages/solid-federation-vocab/fedreg-context.jsonld b/packages/solid-federation-vocab/fedreg-context.jsonld index 3ec760b28..8c78c6c3f 100644 --- a/packages/solid-federation-vocab/fedreg-context.jsonld +++ b/packages/solid-federation-vocab/fedreg-context.jsonld @@ -3,8 +3,8 @@ "@version": 1.1, "@protected": true, - "fedreg": "https://w3id.org/jeswr/fedreg#", - "fedapp": "https://w3id.org/jeswr/fed#", + "fedreg": "https://jeswr.org/ns/fedreg#", + "fedapp": "https://jeswr.org/ns/fed#", "dcat": "http://www.w3.org/ns/dcat#", "dct": "http://purl.org/dc/terms/", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", diff --git a/packages/solid-federation-vocab/fedreg.ttl b/packages/solid-federation-vocab/fedreg.ttl index 0de01733b..c04a5c43b 100644 --- a/packages/solid-federation-vocab/fedreg.ttl +++ b/packages/solid-federation-vocab/fedreg.ttl @@ -1,12 +1,12 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # # Federation Catalogue / Registry Vocabulary (fedreg:) -# Namespace: https://w3id.org/jeswr/fedreg# (ADR-0013, prod-solid-server) +# Namespace: https://jeswr.org/ns/fedreg# (ADR-0013, prod-solid-server) # # The "Catalogue / Registry" federation service — one of the five services a # Solid federation node provides (R9 §2.2 / research brief 09 §2 + §6 rec #6 in # jeswr/full-solid-ecosystem). It is the DISCOVERY axis, distinct from: -# - fedapp: (https://w3id.org/jeswr/fed#) — an app's SELF-ASSERTED registration +# - fedapp: (https://jeswr.org/ns/fed#) — an app's SELF-ASSERTED registration # in its Client Identifier Document; and # - the Vocabulary/Spec Hub — the canonical, versioned client-client specs. # @@ -42,8 +42,8 @@ # @jeswr/federation-registry goes through n3.Writer / @rdfjs/wrapper typed # accessors — never hand-built quads. -@prefix fedreg: . -@prefix fedapp: . +@prefix fedreg: . +@prefix fedapp: . @prefix fedcon: . @prefix rdf: . @prefix rdfs: . @@ -57,20 +57,21 @@ # Ontology ################################################################# - - a owl:Ontology ; + a owl:Ontology ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Federation Catalogue / Registry Vocabulary"@en ; dcterms:description """The Catalogue / Registry federation service: a registry document listing member apps with a registry-asserted membership status, and a resource-server catalogue entry advertising which client-client spec-versions and data sectors it accepts. The discovery axis of a Solid data federation, distinct from an app's self-asserted - fedapp: registration."""@en ; + fedapp: registration. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; dcterms:creator "Claude Opus 4.8 (@jeswr PSS agent)" ; dcterms:issued "2026-06-16"^^xsd:date ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/fedreg#" ; + vann:preferredNamespaceUri "https://jeswr.org/ns/fedreg#" ; vann:preferredNamespacePrefix "fedreg" ; - rdfs:seeAlso ; + rdfs:seeAlso ; rdfs:comment "Experimental — AI-agent-generated; under active development, not production-hardened."@en . ################################################################# @@ -88,7 +89,7 @@ fedreg:Registry documents, a Registry's entries carry the registry's OWN membership assertion — so a consumer can trust the listing as a membership claim, not merely an app's self-description."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:RegistryAssertion a rdfs:Class, owl:Class ; @@ -106,7 +107,7 @@ fedreg:RegistryAssertion fedreg:assertedBy authority a verifier checks against its trust set. (The cryptographic signature binding the assertion to that authority is layered above this vocabulary.)"""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:Membership a rdfs:Class, owl:Class ; @@ -125,7 +126,7 @@ fedreg:Membership REGISTRY-ASSERTED counterpart to the app's self-asserted fedapp:App: a verifier treats a Membership as a membership claim only when it is asserted by a recognised authority — never the app's own fedapp: document."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:MembershipStatus a rdfs:Class, owl:Class ; @@ -136,7 +137,7 @@ fedreg:MembershipStatus recovery lever (brief 07 'recovery'): a misbehaving app is suspended or revoked at the registry without touching the app's own self-asserted document."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:StorageDescription a rdfs:Class, owl:Class ; @@ -149,7 +150,7 @@ fedreg:StorageDescription substrate for asynchronous schema migration: during a dual-read window the storage advertises both versions, so participants upgrade on their own clock. The subject is typically the storage root IRI."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . ################################################################# # Membership-status coded values (instances of MembershipStatus) @@ -160,7 +161,7 @@ fedreg:Proposed rdfs:label "Proposed"@en ; rdfs:comment """A membership proposed but not yet ratified by the federation's Scheme Authority — the app appears in the registry pending review."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:Active a fedreg:MembershipStatus ; @@ -168,7 +169,7 @@ fedreg:Active rdfs:comment """A current, ratified membership — the app is a recognised member of the federation and its self-asserted fedapp: footprint has been accepted."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:Suspended a fedreg:MembershipStatus ; @@ -176,7 +177,7 @@ fedreg:Suspended rdfs:comment """A membership temporarily withdrawn (e.g. pending investigation of a data-integrity issue). Reversible — distinct from fedreg:Revoked. The recovery lever for a misbehaving member."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:Revoked a fedreg:MembershipStatus ; @@ -184,7 +185,7 @@ fedreg:Revoked rdfs:comment """A membership permanently withdrawn — the app is no longer a member. A consumer MUST treat a revoked member as untrusted regardless of the app's own self-asserted fedapp: claims."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . ################################################################# # Properties — Registry / Membership @@ -199,7 +200,7 @@ fedreg:member rdfs:domain fedreg:Registry ; rdfs:range fedreg:Membership ; rdfs:subPropertyOf ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:app a rdf:Property, owl:ObjectProperty ; @@ -209,7 +210,7 @@ fedreg:app self-description)."""@en ; rdfs:domain fedreg:Membership ; rdfs:range fedapp:App ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . # ----------------------------------------------------------------------------- # G1 domain-widening — a DELIBERATE, backward-compatible generalisation. @@ -248,7 +249,7 @@ fedreg:status this membership-shaped status.)"""@en ; rdfs:domain fedreg:RegistryAssertion ; rdfs:range fedreg:MembershipStatus ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:assertedBy a rdf:Property, owl:ObjectProperty ; @@ -261,7 +262,7 @@ fedreg:assertedBy cryptographic signature binding the assertion to that authority is layered above this vocabulary.)"""@en ; rdfs:domain fedreg:RegistryAssertion ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:asserted a rdf:Property, owl:DatatypeProperty ; @@ -271,7 +272,7 @@ fedreg:asserted fedreg:RegistryAssertion (a fedreg:Membership or a fedcon:Admission)."""@en ; rdfs:domain fedreg:RegistryAssertion ; rdfs:range xsd:dateTime ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . ################################################################# # Properties — StorageDescription (spec-version acceptance + sectors) @@ -300,17 +301,17 @@ fedreg:acceptsSpec distinguished by IRI scheme; the existing spec-version usage is unchanged."""@en ; rdfs:domain fedreg:StorageDescription ; rdfs:seeAlso ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:supportsSector a rdf:Property, owl:ObjectProperty ; rdfs:label "supports sector"@en ; - rdfs:comment """A data sector IRI (a https://w3id.org/jeswr/sectors/ + rdfs:comment """A data sector IRI (a https://jeswr.org/ns/sectors/ marker) that this fedreg:StorageDescription's storage supports. Lets an app discover which storages can hold its sector's data before attempting a write."""@en ; rdfs:domain fedreg:StorageDescription ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . fedreg:storage a rdf:Property, owl:ObjectProperty ; @@ -320,4 +321,4 @@ fedreg:storage description's subject, but explicit when a registry collates many storage descriptions in one document."""@en ; rdfs:domain fedreg:StorageDescription ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . diff --git a/packages/solid-federation-vocab/package.json b/packages/solid-federation-vocab/package.json index f28ac520b..445908fad 100644 --- a/packages/solid-federation-vocab/package.json +++ b/packages/solid-federation-vocab/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "type": "module", - "description": "Federation app-registration (fedapp:) + shared task/issue vocabulary under https://w3id.org/jeswr — experimental, AI-agent-generated.", + "description": "Federation app-registration (fedapp:) + shared task/issue vocabulary under https://jeswr.org/ns — experimental, AI-agent-generated.", "license": "MIT", "author": "Claude Opus 4.8 (@jeswr PSS agent)", "repository": { @@ -15,11 +15,11 @@ }, "scripts": { "lint": "node scripts/lint.mjs", - "typecheck": "node --check scripts/validate.mjs && node --check scripts/lint.mjs && node --check scripts/build.mjs && node --check scripts/example.mjs && node --check scripts/ontology-gate.mjs && node --check scripts/import-sectors.mjs", - "test": "node scripts/validate.mjs", + "typecheck": "node --check scripts/validate.mjs && node --check scripts/lint.mjs && node --check scripts/build.mjs && node --check scripts/example.mjs && node --check scripts/ontology-gate.mjs && node --check scripts/import-sectors.mjs && node --check scripts/legacy-w3id-alignments.mjs && node --check scripts/test-rebase.mjs && node --check scripts/verify-persistent-ids.mjs", + "test": "node scripts/validate.mjs && node scripts/test-rebase.mjs", "ontology": "node scripts/ontology-gate.mjs", "build": "node scripts/build.mjs && node scripts/example.mjs", - "gate": "npm run lint && npm run typecheck && npm test && npm run ontology && npm run build" + "gate": "npm run lint && npm run build && npm run typecheck && npm test && npm run ontology" }, "devDependencies": { "@rdfjs/wrapper": "^0.34.0", diff --git a/packages/solid-federation-vocab/scripts/build.mjs b/packages/solid-federation-vocab/scripts/build.mjs index 14d6de886..f996d0171 100644 --- a/packages/solid-federation-vocab/scripts/build.mjs +++ b/packages/solid-federation-vocab/scripts/build.mjs @@ -8,7 +8,7 @@ // N-Triples dump at dist/vocab.nt) — the round-trip proves the source // parses AND that we go through the typed RDF writer, never string-concat, // 3. copies the source vocab files into docs/ so Pages serves them at the -// w3id redirect target. +// jeswr.org content-negotiation target. // // RDF goes through n3 only (suite house rule: never a bespoke serialiser). @@ -44,7 +44,7 @@ const jsonldFiles = readdirSync(ROOT).filter((f) => f.endsWith(".jsonld")); // 1 + 2 — parse all Turtle, re-serialise via n3.Writer. const allQuads = []; for (const file of ttlFiles) { - const quads = new Parser({ baseIRI: `https://w3id.org/jeswr/${file}` }).parse( + const quads = new Parser({ baseIRI: `https://jeswr.org/ns/${file}` }).parse( readFileSync(join(ROOT, file), "utf8"), ); allQuads.push(...quads); @@ -63,7 +63,7 @@ console.log(`dist/vocab.nt — ${allQuads.length} triples (n3.Writer)`); // 3 — copy served sources into docs/. The Turtle is also published under the // namespace-slug name (fed.ttl / task.ttl) so the served path matches the IRI -// the w3id redirect resolves (…/fed → fed.ttl). The descriptive source name +// the namespace handler resolves (…/fed → fed.ttl). The descriptive source name // (fedapp.ttl) is kept too for humans browsing the repo. const TTL_SLUG = { "fedapp.ttl": "fed.ttl", @@ -99,9 +99,9 @@ const esc = (s) => // `slug` is the PUBLIC namespace slug / route (fed, task, fedcon) — NOT the source // filename (fedapp.ttl). `ctx` is the matching JSON-LD context filename. `base` is // the FULL namespace base URI WITHOUT the trailing `#` (e.g. -// "https://w3id.org/jeswr/fed", or "https://jeswr.org/fedcon" for fedcon:, which is -// NOT w3id-rooted) — passed explicitly so the generated title/H1 show each vocab's -// REAL namespace root rather than assuming the w3id.org/jeswr/ prefix. +// "https://jeswr.org/ns/fed", or "https://jeswr.org/fedcon" for fedcon:, which is +// outside /ns/) — passed explicitly so the generated title/H1 show each vocab's +// namespace root rather than assuming the /ns/ prefix. function htmlFor(slug, ctx, base, ttl) { const quads = new Parser({ baseIRI: base }).parse(ttl); const byS = new Map(); @@ -114,8 +114,8 @@ function htmlFor(slug, ctx, base, ttl) { byS.set(q.subject.value, e); } const ns = slug; - // The namespace root shown in the title/H1 — the REAL base per vocab (w3id.org - // for fed/fedreg/task, jeswr.org for fedcon), never a hardcoded w3id assumption. + // The namespace root shown in the title/H1 — the REAL base per vocabulary (jeswr.org/ns + // for fed/fedreg/task, jeswr.org for fedcon). const titleBase = base.replace(/^https?:\/\//, ""); const rows = [...byS] .filter(([, e]) => !e.types.includes(OWL_ONTOLOGY) && e.label) @@ -157,11 +157,11 @@ ${rows} } // [file, slug, ctx, base] — `base` is each vocab's FULL namespace root without the -// trailing `#`. fedcon: is jeswr.org-rooted (NOT w3id.org/jeswr) — see fedcon.ttl. +// trailing `#`. fedcon: is jeswr.org-rooted (NOT jeswr.org/ns) — see fedcon.ttl. for (const [file, slug, ctx, base] of [ - ["fedapp.ttl", "fed", "context.jsonld", "https://w3id.org/jeswr/fed"], - ["fedreg.ttl", "fedreg", "fedreg-context.jsonld", "https://w3id.org/jeswr/fedreg"], - ["task.ttl", "task", "task-context.jsonld", "https://w3id.org/jeswr/task"], + ["fedapp.ttl", "fed", "context.jsonld", "https://jeswr.org/ns/fed"], + ["fedreg.ttl", "fedreg", "fedreg-context.jsonld", "https://jeswr.org/ns/fedreg"], + ["task.ttl", "task", "task-context.jsonld", "https://jeswr.org/ns/task"], ["fedcon.ttl", "fedcon", "fedcon-context.jsonld", "https://jeswr.org/fedcon"], ]) { const html = htmlFor(slug, ctx, base, readFileSync(join(ROOT, file), "utf8")); @@ -179,7 +179,7 @@ for (const [file, slug, ctx, base] of [ // ============================================================================= // 5 — SECTOR ONTOLOGIES (gUFO Core + the 9 sectors). Served from docs/sectors/ -// (+ docs/core.*) so the w3id routes …/core and …/sectors/ resolve by conneg: +// (+ docs/core.*) so the namespace routes …/core and …/sectors/ resolve by conneg: // text/turtle -> .ttl // application/ld+json -> -context.jsonld // text/html -> .html @@ -190,77 +190,77 @@ const SECTORS_SRC = join(ROOT, "sectors"); const DOCS_SECTORS = join(DOCS, "sectors"); mkdirSync(DOCS_SECTORS, { recursive: true }); -// [srcRel, route, prefix, ns] — route is the w3id path segment (== served slug). +// [srcRel, route, prefix, ns] — route is the namespace path segment (== served slug). const ONTOS = [ - ["sectors/core/core.ttl", "core", "core", "https://w3id.org/jeswr/core#"], + ["sectors/core/core.ttl", "core", "core", "https://jeswr.org/ns/core#"], [ "sectors/identity/identity.ttl", "sectors/identity", "id", - "https://w3id.org/jeswr/sectors/identity#", + "https://jeswr.org/ns/sectors/identity#", ], [ "sectors/finance/finance.ttl", "sectors/finance", "fin", - "https://w3id.org/jeswr/sectors/finance#", + "https://jeswr.org/ns/sectors/finance#", ], [ "sectors/health/health.ttl", "sectors/health", "health", - "https://w3id.org/jeswr/sectors/health#", + "https://jeswr.org/ns/sectors/health#", ], [ "sectors/health/diet/diet.ttl", "sectors/health/diet", "diet", - "https://w3id.org/jeswr/sectors/health/diet#", + "https://jeswr.org/ns/sectors/health/diet#", ], - ["sectors/media/media.ttl", "sectors/media", "media", "https://w3id.org/jeswr/sectors/media#"], + ["sectors/media/media.ttl", "sectors/media", "media", "https://jeswr.org/ns/sectors/media#"], [ "sectors/scheduling/scheduling.ttl", "sectors/scheduling", "sched", - "https://w3id.org/jeswr/sectors/scheduling#", + "https://jeswr.org/ns/sectors/scheduling#", ], [ "sectors/contacts/contacts.ttl", "sectors/contacts", "contact", - "https://w3id.org/jeswr/sectors/contacts#", + "https://jeswr.org/ns/sectors/contacts#", ], [ "sectors/drawing/drawing.ttl", "sectors/drawing", "drawing", - "https://w3id.org/jeswr/sectors/drawing#", + "https://jeswr.org/ns/sectors/drawing#", ], [ "sectors/social/social.ttl", "sectors/social", "social", - "https://w3id.org/jeswr/sectors/social#", + "https://jeswr.org/ns/sectors/social#", ], [ "sectors/bookmarks/bookmarks.ttl", "sectors/bookmarks", "bookmark", - "https://w3id.org/jeswr/sectors/bookmarks#", + "https://jeswr.org/ns/sectors/bookmarks#", ], [ "sectors/futures/futures.ttl", "sectors/futures", "fut", - "https://w3id.org/jeswr/sectors/futures#", + "https://jeswr.org/ns/sectors/futures#", ], [ "sectors/collectibles/collectibles.ttl", "sectors/collectibles", "col", - "https://w3id.org/jeswr/sectors/collectibles#", + "https://jeswr.org/ns/sectors/collectibles#", ], - ["sectors/equine/equine.ttl", "sectors/equine", "eq", "https://w3id.org/jeswr/sectors/equine#"], + ["sectors/equine/equine.ttl", "sectors/equine", "eq", "https://jeswr.org/ns/sectors/equine#"], ]; const RDF_LABEL = `${RDFS}label`; @@ -275,7 +275,7 @@ const XSD = "http://www.w3.org/2001/XMLSchema#"; /** Parse an ontology .ttl and index its OWN-namespace terms. */ function indexOntology(ttl, route, ns) { - const quads = new Parser({ baseIRI: `https://w3id.org/jeswr/${route}` }).parse(ttl); + const quads = new Parser({ baseIRI: `https://jeswr.org/ns/${route}` }).parse(ttl); const store = new Store(quads); const lists = store.extractLists(); const byS = new Map(); @@ -370,7 +370,7 @@ function ontologyHtml(route, prefix, ns, terms, depth) { - w3id.org/jeswr/${route}# — Solid Federation Sector Ontology + jeswr.org/ns/${route}# — Solid Federation Sector Ontology -

https://w3id.org/jeswr/${route}#

+

https://jeswr.org/ns/${route}#

Prefix ${prefix}: · a gUFO-based ontology in the @jeswr Solid federation; imports the Solid Core.

⚠️ Experimental — AI-agent-generated (Claude Opus 4.8, @jeswr PSS agent); under active development, not production-hardened.

Other representations: Turtle · JSON-LD context · index

@@ -399,7 +399,7 @@ ${rows} for (const [srcRel, route, prefix, ns] of ONTOS) { const ttl = readFileSync(join(ROOT, srcRel), "utf8"); const terms = indexOntology(ttl, route, ns); - // Honour the FULL w3id route path so a sub-sector (e.g. sectors/health/diet) + // Honour the FULL namespace route path so a sub-sector (e.g. sectors/health/diet) // nests correctly under docs/ and its `up` depth stays right — the served // path is docs/ (minus the final slug), NOT a flattened docs/sectors/. const routeParts = route.split("/"); @@ -419,7 +419,7 @@ for (const [srcRel, route, prefix, ns] of ONTOS) { // d) SHACL profile + Mode-A alignments (served VERBATIM alongside the vocab) // so a profile's `prof:hasArtifact` constraints URL — advertised at // …/sectors//.shacl.ttl — actually resolves once GitHub Pages / - // the w3id route is live. The source dir is that of the vocabulary .ttl. + // the namespace route is live. The source dir is that of the vocabulary .ttl. const srcDir = dirname(join(ROOT, srcRel)); let extras = ""; for (const sidecar of [`${slug}.shacl.ttl`, `${slug}-alignments.ttl`]) { diff --git a/packages/solid-federation-vocab/scripts/example.mjs b/packages/solid-federation-vocab/scripts/example.mjs index 4a06d6ca3..f52d8cfed 100644 --- a/packages/solid-federation-vocab/scripts/example.mjs +++ b/packages/solid-federation-vocab/scripts/example.mjs @@ -11,7 +11,7 @@ import { fileURLToPath } from "node:url"; import { NamedNodeAs, NamedNodeFrom, SetFrom, TermWrapper } from "@rdfjs/wrapper"; import { DataFactory, Store, Writer } from "n3"; -const FEDAPP = "https://w3id.org/jeswr/fed#"; +const FEDAPP = "https://jeswr.org/ns/fed#"; const ACL = "http://www.w3.org/ns/auth/acl#"; // The shared task CLASS is the re-used wf:Task (NOT a minted tm:Task) — see // task.ttl + the @contexts, which map "Task" → wf:Task. Apps consume/produce @@ -62,7 +62,7 @@ const store = new Store(); const doc = new FedAppDoc("https://app.example/clientid.jsonld", store, DataFactory); doc.types.add(`${FEDAPP}App`); -doc.sector.add("https://w3id.org/jeswr/sectors/scheduling#sector"); +doc.sector.add("https://jeswr.org/ns/sectors/scheduling#sector"); doc.access.add(`${ACL}Read`); doc.access.add(`${ACL}Write`); doc.access.add(`${ACL}Append`); @@ -70,7 +70,7 @@ doc.produces.add(`${WF}Task`); doc.consumes.add(`${WF}Task`); const writer = new Writer({ - prefixes: { fedapp: FEDAPP, acl: ACL, wf: WF, sectors: "https://w3id.org/jeswr/sectors/" }, + prefixes: { fedapp: FEDAPP, acl: ACL, wf: WF, sectors: "https://jeswr.org/ns/sectors/" }, }); writer.addQuads(store.getQuads(null, null, null, null)); diff --git a/packages/solid-federation-vocab/scripts/import-sectors.mjs b/packages/solid-federation-vocab/scripts/import-sectors.mjs index c7f8ef522..af0bf77f5 100644 --- a/packages/solid-federation-vocab/scripts/import-sectors.mjs +++ b/packages/solid-federation-vocab/scripts/import-sectors.mjs @@ -4,10 +4,10 @@ // (identity, finance, health, media, scheduling, contacts) from the // full-solid-ecosystem federation working tree INTO this repo, RE-NAMESPACED from // the placeholder `https://TBD.example/solid/` IRIs to the persistent -// `https://w3id.org/jeswr/` home decided in prod-solid-server ADR-0013: +// `https://jeswr.org/ns/` home decided in DECISIONS V1 (VOC-02): // -// https://TBD.example/solid/core -> https://w3id.org/jeswr/core -// https://TBD.example/solid/ -> https://w3id.org/jeswr/sectors/ +// https://TBD.example/solid/core -> https://jeswr.org/ns/core +// https://TBD.example/solid/ -> https://jeswr.org/ns/sectors/ // // This is a TEXT transform over Turtle source (the .ttl files are authored as // Turtle directly — the suite house rule); every output is then re-parsed with @@ -35,8 +35,8 @@ if (!existsSync(SRC)) { } const OLD_BASE = "https://TBD.example/solid"; -const NEW_CORE = "https://w3id.org/jeswr/core"; -const NEW_SECTORS = "https://w3id.org/jeswr/sectors"; +const NEW_CORE = "https://jeswr.org/ns/core"; +const NEW_SECTORS = "https://jeswr.org/ns/sectors"; const MARKER = "# AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate\n"; @@ -116,7 +116,7 @@ const SECTOR_LABEL = { /** * Append the `sector` marker term that `fedapp:sector` dereferences to - * (`https://w3id.org/jeswr/sectors/#sector`). It is a skos:Concept whose + * (`https://jeswr.org/ns/sectors/#sector`). It is a skos:Concept whose * scheme is the federation sector register; an app's Client-ID document names it * as the sector it operates in. Declared here so the IRI resolves and carries a * definition (validate.mjs requires rdfs:label/comment on each named term). Kept @@ -124,20 +124,20 @@ const SECTOR_LABEL = { * no dependency on the fedapp vocabulary. */ function addSectorMarker(text, sector) { - if (text.includes(``)) return text; + if (text.includes(``)) return text; const label = SECTOR_LABEL[sector] ?? sector; const block = ` # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "${label} sector"@en ; rdfs:comment "The ${label} data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over ${label.toLowerCase()} data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "${label}"@en . `; // ensure a trailing newline then append diff --git a/packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs b/packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs index cdd5a34a8..f40b3d278 100644 --- a/packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs +++ b/packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs @@ -7,7 +7,8 @@ import { execFileSync } from "node:child_process"; import { writeFileSync } from "node:fs"; import { basename, dirname, join, relative } from "node:path"; import { fileURLToPath } from "node:url"; -import { DataFactory, Parser, Writer } from "n3"; +import { NamedNodeAs, NamedNodeFrom, SetFrom, TermWrapper } from "@rdfjs/wrapper"; +import { DataFactory, Parser, Store, Writer } from "n3"; const ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); const WORKSPACE = join(ROOT, "..", ".."); @@ -17,7 +18,27 @@ const newRoot = "https://jeswr.org/ns/"; const RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; const RDFS = "http://www.w3.org/2000/01/rdf-schema#"; const OWL = "http://www.w3.org/2002/07/owl#"; -const { namedNode, quad } = DataFactory; +class LegacyAlignment extends TermWrapper { + get equivalentClass() { + return SetFrom.subjectPredicate( + this, + `${OWL}equivalentClass`, + NamedNodeAs.string, + NamedNodeFrom.string, + ); + } + get equivalentProperty() { + return SetFrom.subjectPredicate( + this, + `${OWL}equivalentProperty`, + NamedNodeAs.string, + NamedNodeFrom.string, + ); + } + get sameAs() { + return SetFrom.subjectPredicate(this, `${OWL}sameAs`, NamedNodeAs.string, NamedNodeFrom.string); + } +} const git = (...args) => execFileSync("git", args, { cwd: WORKSPACE, encoding: "utf8" }); const packagePath = relative(WORKSPACE, ROOT); const files = git("ls-tree", "-r", "--name-only", sourceRef, "--", packagePath) @@ -49,6 +70,7 @@ for (const file of files) { } const writer = new Writer({ prefixes: { owl: OWL } }); +const mappings = new Store(); const counts = { equivalentClass: 0, equivalentProperty: 0, sameAs: 0 }; for (const [iri, types] of [...terms].sort(([a], [b]) => a.localeCompare(b))) { if (types.size === 0) throw new Error(`${iri}: no declared type; cannot classify legacy term`); @@ -63,15 +85,11 @@ for (const [iri, types] of [...terms].sort(([a], [b]) => a.localeCompare(b))) { ].some((type) => types.has(type)) ? "equivalentProperty" : "sameAs"; - writer.addQuad( - quad( - namedNode(iri), - namedNode(`${OWL}${relation}`), - namedNode(newRoot + iri.slice(oldRoot.length)), - ), - ); + const term = new LegacyAlignment(iri, mappings, DataFactory); + term[relation].add(newRoot + iri.slice(oldRoot.length)); counts[relation] += 1; } +writer.addQuads(mappings.getQuads(null, null, null, null)); const turtle = await new Promise((resolve, reject) => { writer.end((error, result) => (error ? reject(error) : resolve(result))); }); diff --git a/packages/solid-federation-vocab/scripts/ontology-gate.mjs b/packages/solid-federation-vocab/scripts/ontology-gate.mjs index a24fc615c..c6e5288a7 100644 --- a/packages/solid-federation-vocab/scripts/ontology-gate.mjs +++ b/packages/solid-federation-vocab/scripts/ontology-gate.mjs @@ -51,24 +51,24 @@ const note = (m) => console.log(` · ${m}`); // carry label + definition. SHACL/alignments/imports files are parsed for // well-formedness but their shapes/bridges aren't held to the F1 term rule. const ONTOLOGIES = [ - { dir: "core", file: "core.ttl", ns: "https://w3id.org/jeswr/core#" }, - { dir: "identity", file: "identity.ttl", ns: "https://w3id.org/jeswr/sectors/identity#" }, - { dir: "finance", file: "finance.ttl", ns: "https://w3id.org/jeswr/sectors/finance#" }, - { dir: "health", file: "health.ttl", ns: "https://w3id.org/jeswr/sectors/health#" }, - { dir: "health/diet", file: "diet.ttl", ns: "https://w3id.org/jeswr/sectors/health/diet#" }, - { dir: "media", file: "media.ttl", ns: "https://w3id.org/jeswr/sectors/media#" }, - { dir: "scheduling", file: "scheduling.ttl", ns: "https://w3id.org/jeswr/sectors/scheduling#" }, - { dir: "contacts", file: "contacts.ttl", ns: "https://w3id.org/jeswr/sectors/contacts#" }, - { dir: "drawing", file: "drawing.ttl", ns: "https://w3id.org/jeswr/sectors/drawing#" }, - { dir: "social", file: "social.ttl", ns: "https://w3id.org/jeswr/sectors/social#" }, - { dir: "bookmarks", file: "bookmarks.ttl", ns: "https://w3id.org/jeswr/sectors/bookmarks#" }, - { dir: "futures", file: "futures.ttl", ns: "https://w3id.org/jeswr/sectors/futures#" }, + { dir: "core", file: "core.ttl", ns: "https://jeswr.org/ns/core#" }, + { dir: "identity", file: "identity.ttl", ns: "https://jeswr.org/ns/sectors/identity#" }, + { dir: "finance", file: "finance.ttl", ns: "https://jeswr.org/ns/sectors/finance#" }, + { dir: "health", file: "health.ttl", ns: "https://jeswr.org/ns/sectors/health#" }, + { dir: "health/diet", file: "diet.ttl", ns: "https://jeswr.org/ns/sectors/health/diet#" }, + { dir: "media", file: "media.ttl", ns: "https://jeswr.org/ns/sectors/media#" }, + { dir: "scheduling", file: "scheduling.ttl", ns: "https://jeswr.org/ns/sectors/scheduling#" }, + { dir: "contacts", file: "contacts.ttl", ns: "https://jeswr.org/ns/sectors/contacts#" }, + { dir: "drawing", file: "drawing.ttl", ns: "https://jeswr.org/ns/sectors/drawing#" }, + { dir: "social", file: "social.ttl", ns: "https://jeswr.org/ns/sectors/social#" }, + { dir: "bookmarks", file: "bookmarks.ttl", ns: "https://jeswr.org/ns/sectors/bookmarks#" }, + { dir: "futures", file: "futures.ttl", ns: "https://jeswr.org/ns/sectors/futures#" }, { dir: "collectibles", file: "collectibles.ttl", - ns: "https://w3id.org/jeswr/sectors/collectibles#", + ns: "https://jeswr.org/ns/sectors/collectibles#", }, - { dir: "equine", file: "equine.ttl", ns: "https://w3id.org/jeswr/sectors/equine#" }, + { dir: "equine", file: "equine.ttl", ns: "https://jeswr.org/ns/sectors/equine#" }, ]; // ============================================================================= @@ -92,7 +92,7 @@ let totalQuads = 0; for (const p of ttlFiles.sort()) { const rel = relative(ROOT, p); try { - const quads = new Parser({ baseIRI: `https://w3id.org/jeswr/${rel}` }).parse( + const quads = new Parser({ baseIRI: `https://jeswr.org/ns/${rel}` }).parse( readFileSync(p, "utf8"), ); parsedQuads.set(p, quads); @@ -165,14 +165,14 @@ for (const { dir, file, ns } of ONTOLOGIES) { // vocabularies, not gUFO-rooted domain ontologies. (validate.mjs additionally // requires rdfs:isDefinedBy on these; this layer mirrors the sector term-hygiene // bar so the same rule is visible in the ontology gate.) Note fedcon: mints under -// https://jeswr.org/fedcon# — the one root vocab NOT under w3id.org/jeswr. +// https://jeswr.org/fedcon# — the one root vocab NOT under jeswr.org/ns. // ============================================================================= console.log("\nLayer 2b — root governance-vocab term hygiene (fedapp / fedreg / fedcon / task):"); const ROOT_VOCABS = [ - { file: "fedapp.ttl", ns: "https://w3id.org/jeswr/fed#" }, - { file: "fedreg.ttl", ns: "https://w3id.org/jeswr/fedreg#" }, + { file: "fedapp.ttl", ns: "https://jeswr.org/ns/fed#" }, + { file: "fedreg.ttl", ns: "https://jeswr.org/ns/fedreg#" }, { file: "fedcon.ttl", ns: "https://jeswr.org/fedcon#" }, - { file: "task.ttl", ns: "https://w3id.org/jeswr/task#" }, + { file: "task.ttl", ns: "https://jeswr.org/ns/task#" }, ]; for (const { file, ns } of ROOT_VOCABS) { const p = join(ROOT, file); @@ -182,7 +182,7 @@ for (const { file, ns } of ROOT_VOCABS) { } let quads; try { - quads = new Parser({ baseIRI: `https://w3id.org/jeswr/${file}` }).parse( + quads = new Parser({ baseIRI: `https://jeswr.org/ns/${file}` }).parse( readFileSync(p, "utf8"), ); } catch (err) { diff --git a/packages/solid-federation-vocab/scripts/test-rebase.mjs b/packages/solid-federation-vocab/scripts/test-rebase.mjs new file mode 100644 index 000000000..1861abe53 --- /dev/null +++ b/packages/solid-federation-vocab/scripts/test-rebase.mjs @@ -0,0 +1,183 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +// Regression checks for the VOC-02 migration and its opt-in legacy sidecar. +// Local ontology tooling uses the same n3 parser/store as ontology-gate.mjs. + +import assert from "node:assert/strict"; +import { existsSync, readdirSync, readFileSync } from "node:fs"; +import { basename, dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; +import { Parser, Store } from "n3"; + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); +const oldRoot = new URL("/jeswr/", "https://w3id.org").href; +const newRoot = "https://jeswr.org/ns/"; +const OWL = "http://www.w3.org/2002/07/owl#"; +const RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; +const RDFS = "http://www.w3.org/2000/01/rdf-schema#"; +const DCT = "http://purl.org/dc/terms/"; +const legacyFile = "legacy-w3id-alignments.ttl"; +const parse = (file) => + new Store(new Parser({ baseIRI: newRoot }).parse(readFileSync(file, "utf8"))); +function walk(dir) { + return readdirSync(dir, { withFileTypes: true }).flatMap((entry) => { + const path = join(dir, entry.name); + return entry.isDirectory() ? walk(path) : [path]; + }); +} +const sectorFiles = walk(join(ROOT, "sectors")); +const mainFiles = ["fedapp.ttl", "fedreg.ttl", "task.ttl"] + .map((file) => join(ROOT, file)) + .concat(sectorFiles.filter((file) => basename(file) === `${basename(dirname(file))}.ttl`)); +assert.equal(mainFiles.length, 17); +const currentTerms = new Map(); +for (const file of mainFiles) { + const store = parse(file); + const [ontology] = store.getSubjects(`${RDF}type`, `${OWL}Ontology`, null); + assert.ok(ontology.value.startsWith(newRoot), file); + for (const q of store) { + if (q.subject.termType !== "NamedNode" || !q.subject.value.startsWith(`${ontology.value}#`)) + continue; + const types = currentTerms.get(q.subject.value) ?? new Set(); + if (q.predicate.value === `${RDF}type`) types.add(q.object.value); + currentTerms.set(q.subject.value, types); + } +} +assert.equal(currentTerms.size, 774, "pre-rebase term inventory must be preserved"); +const legacy = parse(join(ROOT, legacyFile)); +assert.equal(legacy.size, currentTerms.size, "exactly one mapping per pre-rebase term"); +const seen = new Set(); +const counts = { equivalentClass: 0, equivalentProperty: 0, sameAs: 0 }; +for (const q of legacy) { + assert.equal(q.subject.termType, "NamedNode"); + assert.ok(q.subject.value.startsWith(oldRoot)); + assert.ok(!seen.has(q.subject.value), `duplicate mapping: ${q.subject.value}`); + seen.add(q.subject.value); + assert.equal(q.object.termType, "NamedNode"); + const target = newRoot + q.subject.value.slice(oldRoot.length); + assert.equal(q.object.value, target, "mapping must point old → new with the same local term"); + const types = currentTerms.get(target); + assert.ok(types?.size, `mapped term must exist: ${target}`); + if (types.has(`${OWL}Class`) || types.has(`${RDFS}Class`)) { + assert.equal(q.predicate.value, `${OWL}equivalentClass`); + counts.equivalentClass += 1; + } else if ( + [...types].some((type) => + [ + `${RDF}Property`, + `${OWL}ObjectProperty`, + `${OWL}DatatypeProperty`, + `${OWL}AnnotationProperty`, + ].includes(type), + ) + ) { + assert.equal(q.predicate.value, `${OWL}equivalentProperty`); + counts.equivalentProperty += 1; + } else { + assert.equal(q.predicate.value, `${OWL}sameAs`); + counts.sameAs += 1; + } +} +assert.deepEqual(counts, { equivalentClass: 220, equivalentProperty: 304, sameAs: 250 }); +assert.equal( + readFileSync(join(ROOT, legacyFile), "utf8"), + readFileSync(join(ROOT, "docs", legacyFile), "utf8"), +); +console.log("✓ All 774 legacy terms have exactly one correctly typed old → new mapping."); + +let ontologyCount = 0; +const rootFiles = readdirSync(ROOT) + .filter((file) => file.endsWith(".ttl") && file !== legacyFile) + .map((file) => join(ROOT, file)); +for (const file of [...rootFiles, ...sectorFiles.filter((file) => file.endsWith(".ttl"))]) { + const store = parse(file); + for (const q of store) { + for (const term of [q.subject, q.predicate, q.object]) { + assert.ok(!term.value.includes(oldRoot), `${file}: active legacy reference`); + } + if (q.predicate.value === `${OWL}imports`) { + assert.ok(!q.object.value.includes("legacy-w3id"), `${file}: imported legacy sidecar`); + } + } + for (const ontology of store.getSubjects(`${RDF}type`, `${OWL}Ontology`, null)) { + if (!ontology.value.startsWith(newRoot)) continue; // preserve third-party ontologies + ontologyCount += 1; + assert.deepEqual( + store.getObjects(ontology, `${OWL}versionInfo`, null).map((term) => term.value), + ["2.0.0"], + file, + ); + assert.deepEqual( + store.getObjects(ontology, `${OWL}versionIRI`, null).map((term) => term.value), + [`${ontology.value}/2.0.0`], + file, + ); + assert.ok( + store + .getObjects(ontology, `${DCT}description`, null) + .some((term) => term.value.includes("rebases this ontology")), + `${file}: missing rebase explanation`, + ); + } +} +assert.equal(ontologyCount, 34, "main ontologies, owned sidecars and curated modules versioned"); +for (const file of walk(join(ROOT, "docs")).filter((path) => basename(path) !== legacyFile)) { + assert.ok( + !readFileSync(file, "utf8").includes(oldRoot), + `${file}: generated docs retain legacy base`, + ); +} +const merged = readFileSync(join(ROOT, "dist", "vocab.nt"), "utf8"); +assert.ok(!merged.includes(oldRoot), "legacy sidecar must stay outside dist/vocab.nt"); +const fedcon = parse(join(ROOT, "fedcon.ttl")); +assert.equal( + fedcon.getSubjects(`${RDF}type`, `${OWL}Ontology`, null)[0].value, + "https://jeswr.org/fedcon", +); +assert.equal( + fedcon.countQuads(null, `${OWL}versionIRI`, null, null), + 0, + "fedcon version unchanged", +); +console.log( + "✓ All 34 rebased ontologies are 2.0.0; fedcon identity is preserved; docs and build exclude legacy IRIs.", +); + +// Verify every catalog target exists and each new namespace alias identifies the +// target ontology (or its version). XML catalogs here contain literal uri pairs. +let catalogCount = 0; +for (const file of sectorFiles.filter((path) => basename(path) === "catalog-v001.xml")) { + const aliases = new Map(); + for (const [, iri, target] of readFileSync(file, "utf8").matchAll( + //g, + )) { + const path = join(dirname(file), target); + assert.ok(existsSync(path), `${file}: missing ${target}`); + aliases.set(iri, path); + if (!iri.startsWith(newRoot)) continue; + const store = parse(path); + assert.ok( + store.countQuads(iri.replace(/#$/, ""), `${RDF}type`, `${OWL}Ontology`, null) > 0 || + store.countQuads(null, `${OWL}versionIRI`, iri, null) > 0, + `${file}: stale ontology/version alias ${iri}`, + ); + } + const main = join(dirname(file), `${basename(dirname(file))}.ttl`); + const visited = new Set(); + const visit = (path) => { + if (visited.has(path)) return; + visited.add(path); + for (const imported of parse(path).getObjects(null, `${OWL}imports`, null)) { + const target = aliases.get(imported.value); + assert.ok(target, `${file}: import not resolved offline: ${imported.value}`); + assert.ok( + !target.endsWith(legacyFile), + "legacy equivalences must stay out of every import closure", + ); + visit(target); + } + }; + visit(main); + catalogCount += 1; +} +assert.equal(catalogCount, 14); +console.log("✓ All 14 catalog import closures resolve offline and exclude the legacy sidecar."); diff --git a/packages/solid-federation-vocab/scripts/validate.mjs b/packages/solid-federation-vocab/scripts/validate.mjs index 0763db263..a0e1b34d3 100644 --- a/packages/solid-federation-vocab/scripts/validate.mjs +++ b/packages/solid-federation-vocab/scripts/validate.mjs @@ -39,7 +39,7 @@ for (const file of ttlFiles) { const ttl = readFileSync(join(ROOT, file), "utf8"); let quads; try { - quads = new Parser({ baseIRI: `https://w3id.org/jeswr/${file}` }).parse(ttl); + quads = new Parser({ baseIRI: `https://jeswr.org/ns/${file}` }).parse(ttl); } catch (err) { fail(`parse error: ${err.message}`); continue; @@ -71,7 +71,7 @@ for (const file of ttlFiles) { let termCount = 0; for (const [iri, info] of subjects) { if (info.types.has(OWL_ONTOLOGY)) continue; // ontology node — checked separately - if (info.types.size === 0 && !iri.startsWith("https://w3id.org/jeswr/")) continue; + if (info.types.size === 0 && !iri.startsWith("https://jeswr.org/ns/")) continue; termCount += 1; for (const required of [`${RDFS}label`, `${RDFS}comment`, `${RDFS}isDefinedBy`]) { if (!info.preds.has(required)) { @@ -155,7 +155,7 @@ for (const file of ctxFiles) { const expanded = await jsonld.expand(admission); const [node] = expanded; const statusIri = node?.["https://jeswr.org/fedcon#conceptStatus"]?.[0]?.["@id"]; - const assertedByIri = node?.["https://w3id.org/jeswr/fedreg#assertedBy"]?.[0]?.["@id"]; + const assertedByIri = node?.["https://jeswr.org/ns/fedreg#assertedBy"]?.[0]?.["@id"]; if (statusIri !== "https://jeswr.org/fedcon#Proposed") fail(`ConceptProposed did not expand to fedcon:Proposed (got ${statusIri})`); else if (assertedByIri !== "https://registry.example/card#me") @@ -172,10 +172,10 @@ for (const file of ctxFiles) { // xsd:string values. Explicitly typed all-day value objects must still win. console.log("\nJSON-LD: temporal context compatibility"); for (const [file, ns, properties] of [ - ["core-context.jsonld", "https://w3id.org/jeswr/core#", ["validFrom", "validUntil"]], + ["core-context.jsonld", "https://jeswr.org/ns/core#", ["validFrom", "validUntil"]], [ "sectors/scheduling-context.jsonld", - "https://w3id.org/jeswr/sectors/scheduling#", + "https://jeswr.org/ns/sectors/scheduling#", ["startTime", "endTime", "dueTime", "until"], ], ]) { diff --git a/packages/solid-federation-vocab/scripts/verify-persistent-ids.mjs b/packages/solid-federation-vocab/scripts/verify-persistent-ids.mjs new file mode 100644 index 000000000..0f5c0efe3 --- /dev/null +++ b/packages/solid-federation-vocab/scripts/verify-persistent-ids.mjs @@ -0,0 +1,74 @@ +// AUTHORED-BY Codex GPT-6.1-Sol +// Read-only VOC-02 registry verification. Pass an unmodified local copy of +// jeswr/portfolio config/persistent-ids.ts, or fetch the default-branch copy. +// Emits TSV suitable for a review attachment; exits nonzero on any failed URL. + +import assert from "node:assert/strict"; +import { existsSync, readFileSync } from "node:fs"; +import { stripTypeScriptTypes } from "node:module"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); +const registryUrl = + "https://raw.githubusercontent.com/jeswr/portfolio/main/config/persistent-ids.ts"; +const source = process.argv[2] + ? readFileSync(process.argv[2], "utf8") + : await (async () => { + const response = await fetch(registryUrl, { signal: AbortSignal.timeout(15000) }); + assert.equal(response.status, 200, "portfolio registry must answer 200"); + return response.text(); + })(); +const registry = await import( + `data:text/javascript,${encodeURIComponent(stripTypeScriptTypes(source))}` +); +const entries = registry.PERSISTENT_IDS.filter( + (entry) => + entry.tree === "ns" && + (["fed", "fedreg", "task", "core"].includes(entry.slug) || entry.slug.startsWith("sectors/")), +); +assert.equal(entries.length, 17, "expected all 17 registered federation namespaces"); +const jobs = []; +for (const entry of entries) { + const legacy = new URL(entry.w3id); + assert.equal(legacy.origin, "https://w3id.org", `${entry.slug}: retain legacy predecessor`); + assert.equal(legacy.pathname, `/jeswr/${entry.slug}`, `${entry.slug}: retain legacy path`); + for (const rep of ["turtle", "html", "jsonld"]) { + const url = entry[rep]; + assert.equal(typeof url, "string", `${entry.slug}: missing ${rep}`); + const path = new URL(url).pathname; + const file = + rep === "html" ? path.replace(/^\/solid-federation-vocab\//, "") : path.split("/docs/")[1]; + assert.ok(file && existsSync(join(ROOT, "docs", file)), `${entry.slug}: missing docs/${file}`); + jobs.push({ slug: entry.slug, rep, url }); + } +} +console.log("# AUTHORED-BY Codex GPT-6.1-Sol"); +console.log(`# Checked ${new Date().toISOString()}; registry ${registryUrl}`); +console.log( + "# All 17 legacy predecessor fields retained; all 51 target files exist in local docs/.", +); +console.log("slug\trepresentation\tstatus\turl\tfinal-url"); +let failures = 0; +// Batches bound concurrent HTTP traffic without requiring another dependency. +for (let index = 0; index < jobs.length; index += 4) { + const rows = await Promise.all( + jobs.slice(index, index + 4).map(async ({ slug, rep, url }) => { + try { + const response = await fetch(url, { + signal: AbortSignal.timeout(15000), + redirect: "follow", + }); + await response.arrayBuffer(); + if (response.status !== 200) failures += 1; + return [slug, rep, response.status, url, response.url].join("\t"); + } catch (error) { + failures += 1; + return [slug, rep, "ERROR", url, String(error).replace(/[\t\n]/g, " ")].join("\t"); + } + }), + ); + for (const row of rows) console.log(row); +} +console.log(`# ${jobs.length - failures}/${jobs.length} representation URLs answered 200.`); +if (failures) process.exitCode = 1; diff --git a/packages/solid-federation-vocab/sectors/bookmarks/bookmarks-alignments.ttl b/packages/solid-federation-vocab/sectors/bookmarks/bookmarks-alignments.ttl index 2f0ac58fd..cd4d84620 100644 --- a/packages/solid-federation-vocab/sectors/bookmarks/bookmarks-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/bookmarks/bookmarks-alignments.ttl @@ -1,14 +1,14 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix bookmark: . -@prefix core: . +@prefix bookmark: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @prefix dcterms: . @prefix schema: . # The forthcoming detailed bookmark vocabulary (ships in @jeswr/solid-bookmark). -@prefix book: . +@prefix book: . # ============================================================================= # Bookmarks Sector Ontology — ALIGNMENTS (Mode A: annotation-only bridges) @@ -23,9 +23,12 @@ # its own repo). Every line is a reviewable claim; nothing is silently inherited. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Solid Bookmarks Sector Ontology — book: + schema.org Mode-A alignments"@en ; - owl:imports ; + owl:imports ; rdfs:comment "Annotation-only (skos:*Match) bridges to the forthcoming @jeswr/solid-bookmark book: vocabulary and to schema.org / DCT / SKOS. No entailment. "@en . # --- Bookmark <-> book:Bookmark (the forthcoming detail vocab) + schema --- diff --git a/packages/solid-federation-vocab/sectors/bookmarks/bookmarks.shacl.ttl b/packages/solid-federation-vocab/sectors/bookmarks/bookmarks.shacl.ttl index 2e1df4e69..9d89f8d7b 100644 --- a/packages/solid-federation-vocab/sectors/bookmarks/bookmarks.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/bookmarks/bookmarks.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix bookmark: . -@prefix bmsh: . -@prefix core: . +@prefix bookmark: . +@prefix bmsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -20,16 +20,16 @@ # grade (Violation=MUST, Warning=SHOULD, Info=MAY); IMMUTABLE version IRI; additive. # ============================================================================= - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Bookmarks data-model profile (version-independent)"@en ; - dcterms:hasVersion ; + dcterms:hasVersion ; rdfs:comment "Version-independent IRI resolving to the current Bookmarks profile. "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Bookmarks data-model profile 1.0.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "bookmarks-1.0.0" ; rdfs:comment "IMMUTABLE version IRI. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . diff --git a/packages/solid-federation-vocab/sectors/bookmarks/bookmarks.ttl b/packages/solid-federation-vocab/sectors/bookmarks/bookmarks.ttl index 2283e30c2..eba65d67d 100644 --- a/packages/solid-federation-vocab/sectors/bookmarks/bookmarks.ttl +++ b/packages/solid-federation-vocab/sectors/bookmarks/bookmarks.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix bookmark: . -@prefix core: . +@prefix bookmark: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -22,7 +22,7 @@ # Bookmark class to hang the SHACL shape + alignments off, and the round-trip # property spine a fork needs (the saved-target URL, an archived flag, free-text # notes, tags). The detailed bookmark vocab (book: = -# https://w3id.org/jeswr/bookmark#, with book:Bookmark, book:archived xsd:boolean, +# https://jeswr.org/ns/bookmark#, with book:Bookmark, book:archived xsd:boolean, # book:notes) ships in the SEPARATE @jeswr/solid-bookmark repo; the alignment HOOKS # to those forthcoming book: terms + to schema.org/dct/skos live in # bookmarks-alignments.ttl (Mode A, annotation-only, no entailment) so this sector @@ -36,14 +36,14 @@ # carries the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Bookmarks & Read-it-later Sector Ontology"@en ; rdfs:label "Solid Bookmarks & Read-it-later Sector Ontology"@en ; vann:preferredNamespacePrefix "bookmark" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/bookmarks#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/bookmarks#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The bookmarks / read-it-later data sector — the domain a federated Linkding-style fork operates in. Authors the sector marker and a thin gUFO-rooted bookmark:Bookmark (a core:InformationResource saved @@ -52,8 +52,8 @@ vocabulary ships in the separate @jeswr/solid-bookmark repo; this file aligns to those forthcoming terms and to schema.org (schema:url, schema:BookmarkAction), Dublin Core Terms and SKOS in the companion - alignments file."""@en ; - dcterms:modified "2026-06-21"^^xsd:date ; + alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Foundation sector for the 5-OSS-fork initiative (Linkding)."@en . # ----------------------------------------------------------------------------- @@ -106,13 +106,13 @@ bookmark:hasTag a owl:ObjectProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Bookmarks & Read-it-later sector"@en ; rdfs:comment "The Bookmarks & Read-it-later data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over bookmark / read-it-later data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Bookmarks & Read-it-later"@en . diff --git a/packages/solid-federation-vocab/sectors/bookmarks/catalog-v001.xml b/packages/solid-federation-vocab/sectors/bookmarks/catalog-v001.xml index a6a82d211..2ef61c38a 100644 --- a/packages/solid-federation-vocab/sectors/bookmarks/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/bookmarks/catalog-v001.xml @@ -22,11 +22,11 @@ - - - + + + - - - + + + diff --git a/packages/solid-federation-vocab/sectors/collectibles/catalog-v001.xml b/packages/solid-federation-vocab/sectors/collectibles/catalog-v001.xml index 3927e9f2b..880afee64 100644 --- a/packages/solid-federation-vocab/sectors/collectibles/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/collectibles/catalog-v001.xml @@ -23,11 +23,11 @@ - - - + + + - - - + + + diff --git a/packages/solid-federation-vocab/sectors/collectibles/collectibles-alignments.ttl b/packages/solid-federation-vocab/sectors/collectibles/collectibles-alignments.ttl index 96e3a083d..b3dab12be 100644 --- a/packages/solid-federation-vocab/sectors/collectibles/collectibles-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/collectibles/collectibles-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix col: . -@prefix core: . +@prefix col: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix rdf: . @@ -32,10 +32,12 @@ # only ANNOTATES the closest CRM/linked.art analogues here. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Collectibles sector — external alignments"@en ; - owl:imports ; - owl:versionInfo "0.1.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; rdfs:comment "Optional Mode-A bridge: schema.org amount/creative-work terms, PROV-O activity/attribution framing, and linked.art (CIDOC-CRM) art-market analogues as reference only. External IRIs are real and governed by their bodies. Nothing is owl:imported into the reasoned closure."@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/sectors/collectibles/collectibles-examples.ttl b/packages/solid-federation-vocab/sectors/collectibles/collectibles-examples.ttl index 2562c9e4f..69f0ca786 100644 --- a/packages/solid-federation-vocab/sectors/collectibles/collectibles-examples.ttl +++ b/packages/solid-federation-vocab/sectors/collectibles/collectibles-examples.ttl @@ -16,8 +16,8 @@ # policy. Attribution is prov:wasAssociatedWith → an Agent NODE; timing is # prov:startedAtTime, never prov:atTime. # -@prefix col: . -@prefix core: . +@prefix col: . +@prefix core: . @prefix schema: . @prefix prov: . @prefix dcterms: . diff --git a/packages/solid-federation-vocab/sectors/collectibles/collectibles.shacl.ttl b/packages/solid-federation-vocab/sectors/collectibles/collectibles.shacl.ttl index f907500df..50d97d6ca 100644 --- a/packages/solid-federation-vocab/sectors/collectibles/collectibles.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/collectibles/collectibles.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix col: . -@prefix colsh: . -@prefix core: . +@prefix col: . +@prefix colsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -39,26 +39,26 @@ # - IMMUTABLE version IRI (.../collectibles/profile/0.1.0); additive-only. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Collectibles data-model profile (version-independent)"@en ; dcterms:description "Resolves to the current Collectibles sector profile version."@en . - + a prof:Profile ; dcterms:title "Solid Collectibles data-model profile"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "0.1.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-collectibles-0.1.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for the collectibles sector."@en . diff --git a/packages/solid-federation-vocab/sectors/collectibles/collectibles.ttl b/packages/solid-federation-vocab/sectors/collectibles/collectibles.ttl index 363f45e7d..ad75a59b5 100644 --- a/packages/solid-federation-vocab/sectors/collectibles/collectibles.ttl +++ b/packages/solid-federation-vocab/sectors/collectibles/collectibles.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix col: . -@prefix core: . +@prefix col: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -60,14 +60,14 @@ # hygiene: external classes referenced in axioms are declared as punned owl terms. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Collectibles Sector Ontology"@en ; rdfs:label "Solid Collectibles Sector Ontology"@en ; vann:preferredNamespacePrefix "col" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/collectibles#" ; - owl:imports ; - owl:versionInfo "0.1.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/collectibles#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The provenance / valuation / insurance data sector for high-value collectible assets (art, antiques, wine, watches, cars) — the sector the Provena revenue product operates in. The asset itself stays a @@ -78,8 +78,8 @@ Replaces the reserved provena.example.org namespace and the non-existent schema:artworkMedium/artworkSize terms. Aligns Mode-A to schema.org, PROV-O and the linked.art (CIDOC-CRM) art-market profile in - collectibles-alignments.ttl."""@en ; - dcterms:modified "2026-07-03"^^xsd:date ; + collectibles-alignments.ttl. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Sector ontology for the Provena product (revenue-products ontology review §1). PROV-O primary, used correctly; linked.art alignment is reference-only, never adopted."@en . # ----------------------------------------------------------------------------- @@ -318,9 +318,9 @@ col:precision-circa a col:DatePrecision, skos:Concept ; # federation sector register; dereferences to this ontology. # ============================================================================= - + a skos:Concept ; rdfs:label "Collectibles sector"@en ; rdfs:comment "The Collectibles (art / collectibles provenance, valuation and insurance) data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over collectible-asset provenance data — the sector the Provena product declares. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Collectibles"@en . diff --git a/packages/solid-federation-vocab/sectors/contacts/catalog-v001.xml b/packages/solid-federation-vocab/sectors/contacts/catalog-v001.xml index 8c772f84c..e3c0529a5 100644 --- a/packages/solid-federation-vocab/sectors/contacts/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/contacts/catalog-v001.xml @@ -22,11 +22,11 @@ - - - + + + - - - + + + diff --git a/packages/solid-federation-vocab/sectors/contacts/contacts-alignments.ttl b/packages/solid-federation-vocab/sectors/contacts/contacts-alignments.ttl index d130819f2..eebcafec3 100644 --- a/packages/solid-federation-vocab/sectors/contacts/contacts-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/contacts/contacts-alignments.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix contact: . -@prefix core: . +@prefix contact: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -35,12 +35,13 @@ # collapse two distinct Core classes (contract §3). # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; dcterms:title "Solid Contacts Sector Ontology — vcard & schema.org alignments (gUFO re-base)"@en ; - owl:imports ; - owl:versionInfo "1.1.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; dcterms:modified "2026-10-25"^^xsd:date ; - owl:versionIRI ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to vcard (the canonical contacts vocab) and schema.org. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/sectors/contacts/contacts.shacl.ttl b/packages/solid-federation-vocab/sectors/contacts/contacts.shacl.ttl index e8848cc7c..6fe1a8c57 100644 --- a/packages/solid-federation-vocab/sectors/contacts/contacts.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/contacts/contacts.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix ctsh: . -@prefix contact: . -@prefix core: . +@prefix ctsh: . +@prefix contact: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -24,18 +24,18 @@ # v1.0.0 tracks the gUFO re-base of contacts.ttl. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Contacts data-model profile (gUFO re-base)"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - owl:versionIRI ; - prof:isProfileOf , + owl:versionIRI ; + prof:isProfileOf , ; prof:hasToken "contacts-1.0.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for address-book data, re-based onto the gUFO Core. "@en . diff --git a/packages/solid-federation-vocab/sectors/contacts/contacts.ttl b/packages/solid-federation-vocab/sectors/contacts/contacts.ttl index ecce289f1..2eb71872f 100644 --- a/packages/solid-federation-vocab/sectors/contacts/contacts.ttl +++ b/packages/solid-federation-vocab/sectors/contacts/contacts.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix contact: . -@prefix core: . +@prefix contact: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -46,14 +46,14 @@ # default; the SHACL profile carries the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Contacts Sector Ontology (gUFO re-base)"@en ; rdfs:label "Solid Contacts Sector Ontology"@en ; vann:preferredNamespacePrefix "contact" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/contacts#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/contacts#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The address-book / contacts sector model for the Solid federation, re-based onto the gUFO Core. A Contact is a core:Record ABOUT a Person or Organization (the card distinct from the agent it names); @@ -63,8 +63,8 @@ roles; lists are core:Group. v1.0.0 is a BREAKING re-base of v0 (the meta-types and the role model change meaning), so a new MAJOR version. Aligns thoroughly to vcard and to schema:ContactPoint/PostalAddress in - the companion alignments file."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + the companion alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2."@en . # ----------------------------------------------------------------------------- @@ -276,13 +276,13 @@ contact:hasMemberContact a owl:ObjectProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Contacts sector"@en ; rdfs:comment "The Contacts data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over contacts data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Contacts"@en . diff --git a/packages/solid-federation-vocab/sectors/core/catalog-v001.xml b/packages/solid-federation-vocab/sectors/core/catalog-v001.xml index 4501e307a..ea80502af 100644 --- a/packages/solid-federation-vocab/sectors/core/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/core/catalog-v001.xml @@ -24,7 +24,7 @@ - - - + + + diff --git a/packages/solid-federation-vocab/sectors/core/core-alignments.ttl b/packages/solid-federation-vocab/sectors/core/core-alignments.ttl index 43a449671..9101f4aa3 100644 --- a/packages/solid-federation-vocab/sectors/core/core-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/core/core-alignments.ttl @@ -1,6 +1,6 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix core: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -38,10 +38,12 @@ # This is the auditable seam: every equivalence here is a reviewable claim. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Core Ontology — alignments (gist + W3C bridges)"@en ; - owl:versionInfo "1.0.0" ; - owl:imports ; + owl:versionInfo "2.0.0" ; + owl:imports ; rdfs:comment "Optional Mode-A bridge to gist (discovery) + foaf/schema/prov/org/vcard/adms/dcat. "@en . # Declare the annotation properties used here so this file is self-describing. diff --git a/packages/solid-federation-vocab/sectors/core/core.shacl.ttl b/packages/solid-federation-vocab/sectors/core/core.shacl.ttl index 844f45059..d5dca00f2 100644 --- a/packages/solid-federation-vocab/sectors/core/core.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/core/core.shacl.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix core: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -30,9 +30,11 @@ # (conformingSet(P@J) ⊆ conformingSet(G), R11 §3.4). # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Core Ontology — SHACL profile"@en ; - owl:versionInfo "1.1.0" ; + owl:versionInfo "2.0.0" ; dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "F4 node shapes for the instantiable gUFO-rebased Core classes. Open by default; MUST=Violation, SHOULD=Warning. v1.1.0 validates optional validity dates as date or dateTime. v1.0.1 added core:QuantityShape (numericValue MUST, unit SHOULD)."@en . diff --git a/packages/solid-federation-vocab/sectors/core/core.ttl b/packages/solid-federation-vocab/sectors/core/core.ttl index c82121d92..7ba333e2f 100644 --- a/packages/solid-federation-vocab/sectors/core/core.ttl +++ b/packages/solid-federation-vocab/sectors/core/core.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix core: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -46,13 +46,13 @@ # SKOS/schema.org) live in the SEPARATE optional solid-core-alignments.ttl. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Core Ontology (gUFO re-base)"@en ; rdfs:label "Solid Core Ontology"@en ; vann:preferredNamespacePrefix "core" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/core#" ; - owl:versionInfo "1.1.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/core#" ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; owl:imports ; dcterms:description """The foundational ontology of the Solid data federation, re-based onto gUFO (the gentle OWL-2-DL implementation of @@ -62,7 +62,7 @@ (e.g. core:Relationship and core:Account are now gufo:Relator, not bare classes), so this is a new MAJOR version. The single mandatory import is now gUFO + this thin profile. External vocabularies are reached via the - companion alignments file, never re-derived."""@en ; + companion alignments file, never re-derived. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §1.3. v1.1.0 widens core:validFrom/core:validUntil to date or dateTime; date values mean all-day. v1.0.1 added core:Quantity + core:numericValue/core:unit."@en . diff --git a/packages/solid-federation-vocab/sectors/drawing/catalog-v001.xml b/packages/solid-federation-vocab/sectors/drawing/catalog-v001.xml index fbc7f0aea..b3bc2c9fe 100644 --- a/packages/solid-federation-vocab/sectors/drawing/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/drawing/catalog-v001.xml @@ -22,11 +22,11 @@ - - - + + + - - - + + + diff --git a/packages/solid-federation-vocab/sectors/drawing/drawing-alignments.ttl b/packages/solid-federation-vocab/sectors/drawing/drawing-alignments.ttl index 03efe0686..5ec565a65 100644 --- a/packages/solid-federation-vocab/sectors/drawing/drawing-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/drawing/drawing-alignments.ttl @@ -1,14 +1,14 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix drawing: . -@prefix core: . +@prefix drawing: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @prefix dcterms: . @prefix schema: . # The forthcoming detailed drawing vocabulary (ships in @jeswr/solid-drawing). -@prefix draw: . +@prefix draw: . # ============================================================================= # Drawing Sector Ontology — ALIGNMENTS (Mode A: annotation-only bridges) @@ -23,9 +23,12 @@ # Every line is a reviewable claim; nothing is silently inherited. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Solid Drawing Sector Ontology — draw: + schema.org Mode-A alignments"@en ; - owl:imports ; + owl:imports ; rdfs:comment "Annotation-only (skos:*Match) bridges to the forthcoming @jeswr/solid-drawing draw: vocabulary and to schema.org. No entailment. "@en . # --- Scene <-> draw:Scene (the forthcoming detail vocab) + schema:CreativeWork --- diff --git a/packages/solid-federation-vocab/sectors/drawing/drawing.shacl.ttl b/packages/solid-federation-vocab/sectors/drawing/drawing.shacl.ttl index 10979db71..d9aee2fdf 100644 --- a/packages/solid-federation-vocab/sectors/drawing/drawing.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/drawing/drawing.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix drawing: . -@prefix drsh: . -@prefix core: . +@prefix drawing: . +@prefix drsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -18,16 +18,16 @@ # grade (Violation=MUST, Warning=SHOULD, Info=MAY); IMMUTABLE version IRI; additive. # ============================================================================= - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Drawing data-model profile (version-independent)"@en ; - dcterms:hasVersion ; + dcterms:hasVersion ; rdfs:comment "Version-independent IRI resolving to the current Drawing profile. "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Drawing data-model profile 1.0.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "drawing-1.0.0" ; rdfs:comment "IMMUTABLE version IRI. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . diff --git a/packages/solid-federation-vocab/sectors/drawing/drawing.ttl b/packages/solid-federation-vocab/sectors/drawing/drawing.ttl index a5d973f6b..5a862d629 100644 --- a/packages/solid-federation-vocab/sectors/drawing/drawing.ttl +++ b/packages/solid-federation-vocab/sectors/drawing/drawing.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix drawing: . -@prefix core: . +@prefix drawing: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -21,7 +21,7 @@ # SCOPE — this file authors the SECTOR ONLY: the domain marker, a thin gUFO-rooted # Scene class to hang the SHACL shape + alignments off, and the property spine the # fork actually needs to round-trip a scene to a pod. The detailed drawing vocab -# (draw: = https://w3id.org/jeswr/drawing#, with draw:Scene rdfs:subClassOf +# (draw: = https://jeswr.org/ns/drawing#, with draw:Scene rdfs:subClassOf # schema:CreativeWork, draw:sceneDocument, draw:schemaVersion, draw:thumbnail) # ships in the SEPARATE @jeswr/solid-drawing repo; the alignment HOOKS to those # forthcoming draw: terms live in drawing-alignments.ttl (Mode A, annotation-only, @@ -35,22 +35,22 @@ # the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Drawing & Whiteboard Sector Ontology"@en ; rdfs:label "Solid Drawing & Whiteboard Sector Ontology"@en ; vann:preferredNamespacePrefix "drawing" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/drawing#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/drawing#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The whiteboard / diagramming data sector — the domain a federated Excalidraw-style fork operates in. Authors the sector marker and a thin gUFO-rooted drawing:Scene (a core:InformationResource creative work) with the round-trip property spine (the opaque scene document, a schema version, an optional thumbnail). The detailed draw: vocabulary ships in the separate @jeswr/solid-drawing repo; this file aligns to those forthcoming - terms and to schema:CreativeWork in the companion alignments file."""@en ; - dcterms:modified "2026-06-21"^^xsd:date ; + terms and to schema:CreativeWork in the companion alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Foundation sector for the 5-OSS-fork initiative (Excalidraw)."@en . # ----------------------------------------------------------------------------- @@ -104,13 +104,13 @@ drawing:thumbnail a owl:ObjectProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Drawing & Whiteboard sector"@en ; rdfs:comment "The Drawing & Whiteboard data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over whiteboard / diagramming data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Drawing & Whiteboard"@en . diff --git a/packages/solid-federation-vocab/sectors/equine/catalog-v001.xml b/packages/solid-federation-vocab/sectors/equine/catalog-v001.xml index 0fec55374..693246cc6 100644 --- a/packages/solid-federation-vocab/sectors/equine/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/equine/catalog-v001.xml @@ -23,11 +23,11 @@ - - - + + + - - - + + + diff --git a/packages/solid-federation-vocab/sectors/equine/equine-alignments.ttl b/packages/solid-federation-vocab/sectors/equine/equine-alignments.ttl index 299eea057..c28683202 100644 --- a/packages/solid-federation-vocab/sectors/equine/equine-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/equine/equine-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix eq: . -@prefix core: . +@prefix eq: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix rdf: . @@ -29,10 +29,12 @@ # are load-bearing rdfs:subClassOf edges in equine.ttl, not annotations here. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Equine sector — external alignments"@en ; - owl:imports ; - owl:versionInfo "0.1.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; rdfs:comment "Optional Mode-A bridge: the W3C Organization ontology for syndicates, schema.org for the price/amount predicates, and a broad DBpedia animal anchor for eq:Horse (schema.org has no animal class). External IRIs are real and governed by their bodies. Nothing is owl:imported into the reasoned closure."@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/sectors/equine/equine-examples.ttl b/packages/solid-federation-vocab/sectors/equine/equine-examples.ttl index f19a91273..fda3c1c7d 100644 --- a/packages/solid-federation-vocab/sectors/equine/equine-examples.ttl +++ b/packages/solid-federation-vocab/sectors/equine/equine-examples.ttl @@ -15,8 +15,8 @@ # (schema:Invoice + schema:totalPaymentDue, coded eq:expenseCategory). Every # private predicate is a SHARED eq: term, not a per-resource #flg. fragment IRI. # -@prefix eq: . -@prefix core: . +@prefix eq: . +@prefix core: . @prefix schema: . @prefix dcterms: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/sectors/equine/equine.shacl.ttl b/packages/solid-federation-vocab/sectors/equine/equine.shacl.ttl index 1cc4a58d6..88c8e6db1 100644 --- a/packages/solid-federation-vocab/sectors/equine/equine.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/equine/equine.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix eq: . -@prefix eqsh: . -@prefix core: . +@prefix eq: . +@prefix eqsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -40,26 +40,26 @@ # - IMMUTABLE version IRI (.../equine/profile/0.1.0); additive-only. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Equine data-model profile (version-independent)"@en ; dcterms:description "Resolves to the current Equine sector profile version."@en . - + a prof:Profile ; dcterms:title "Solid Equine data-model profile"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "0.1.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-equine-0.1.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for the equine sector."@en . diff --git a/packages/solid-federation-vocab/sectors/equine/equine.ttl b/packages/solid-federation-vocab/sectors/equine/equine.ttl index d97b5f8a2..776a7a729 100644 --- a/packages/solid-federation-vocab/sectors/equine/equine.ttl +++ b/packages/solid-federation-vocab/sectors/equine/equine.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix eq: . -@prefix core: . +@prefix eq: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -23,7 +23,7 @@ # resource — coins a different IRI for the same concept: no cross-pod query, no # SHACL shape, no federation membership. This sector REPLACES that whole # `flgPred`/`flgClass` map 1:1 with shared `eq:` terms at a domain the suite owns -# (w3id.org/jeswr), and REPLACES the NON-EXISTENT schema.org terms Furlong wrote: +# (jeswr.org/ns), and REPLACES the NON-EXISTENT schema.org terms Furlong wrote: # - schema:Animal (HTTP 404 — schema.org has no animal class) → eq:Horse; # - schema:prize (HTTP 404 — schema:award (Text) exists) → eq:PrizeDistribution; # - schema:season (media-series only, superseded) → eq:season; @@ -58,14 +58,14 @@ # referenced in axioms are declared as punned owl terms. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Equine Sector Ontology"@en ; rdfs:label "Solid Equine Sector Ontology"@en ; vann:preferredNamespacePrefix "eq" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/equine#" ; - owl:imports ; - owl:versionInfo "0.1.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/equine#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The racehorse ownership / breeding / prize data sector for the Furlong revenue product: horses, ownership + stud shares held via syndicates, stud nominations, race results and prize distributions, plus @@ -74,8 +74,8 @@ schema:Animal/schema:prize/schema:season terms with correct ones. Keeps the real schema.org dual-types (Reservation/SportsEvent/MoneyTransfer). Aligns Mode-A to schema.org, org: and external animal ontologies in - equine-alignments.ttl."""@en ; - dcterms:modified "2026-07-03"^^xsd:date ; + equine-alignments.ttl. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Sector ontology for the Furlong product (revenue-products ontology review §2). Fixes non-existent schema terms + the per-resource-IRI anti-pattern."@en . # ----------------------------------------------------------------------------- @@ -519,9 +519,9 @@ eq:expense-other a eq:ExpenseCategory, skos:Concept ; # federation sector register; dereferences to this ontology. # ============================================================================= - + a skos:Concept ; rdfs:label "Equine sector"@en ; rdfs:comment "The Equine (racehorse ownership, breeding, prize distribution) data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over equine-ownership data — the sector the Furlong product declares. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Equine"@en . diff --git a/packages/solid-federation-vocab/sectors/finance/catalog-v001.xml b/packages/solid-federation-vocab/sectors/finance/catalog-v001.xml index 6cf3df0a8..276a11b41 100644 --- a/packages/solid-federation-vocab/sectors/finance/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/finance/catalog-v001.xml @@ -22,15 +22,13 @@ - - - + + + - - - - - + + + - + diff --git a/packages/solid-federation-vocab/sectors/finance/finance-alignments.ttl b/packages/solid-federation-vocab/sectors/finance/finance-alignments.ttl index ab2783e9a..0723e62fa 100644 --- a/packages/solid-federation-vocab/sectors/finance/finance-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/finance/finance-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix fin: . -@prefix core: . +@prefix fin: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -42,9 +42,12 @@ # Every line is a reviewable claim; nothing is silently inherited. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Solid Finance Sector Ontology — FIBO + ISO 20022 Mode-A alignments"@en ; - owl:imports ; + owl:imports ; rdfs:comment "Annotation-only (skos:closeMatch) bridges to FIBO terms outside the slim module and to ISO 20022. Mode-B FIBO reuse (subClassOf the slim module) is in finance.ttl. "@en . # --- Accounts: subtype-level FIBO matches not carried by the slim module --- diff --git a/packages/solid-federation-vocab/sectors/finance/finance-examples.ttl b/packages/solid-federation-vocab/sectors/finance/finance-examples.ttl index 3b8ac1953..c75e7e71a 100644 --- a/packages/solid-federation-vocab/sectors/finance/finance-examples.ttl +++ b/packages/solid-federation-vocab/sectors/finance/finance-examples.ttl @@ -24,8 +24,8 @@ # replacing the non-dereferencing capnote.app/vocab# and keystone/ns# 404 # namespaces with shared fin: terms. # -@prefix fin: . -@prefix core: . +@prefix fin: . +@prefix core: . @prefix schema: . @prefix fibo-sec-fund-fund: . @prefix dcterms: . diff --git a/packages/solid-federation-vocab/sectors/finance/finance.shacl.ttl b/packages/solid-federation-vocab/sectors/finance/finance.shacl.ttl index 62b21d520..dd68aa45c 100644 --- a/packages/solid-federation-vocab/sectors/finance/finance.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/finance/finance.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix fin: . -@prefix finsh: . -@prefix core: . +@prefix fin: . +@prefix finsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -23,34 +23,34 @@ # - IMMUTABLE version IRI (…/1.0.0) + version-independent IRI; additive-only. # ============================================================================= - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Finance data-model profile (version-independent)"@en ; - dcterms:hasVersion , - , - ; + dcterms:hasVersion , + , + ; rdfs:comment "Version-independent IRI resolving to the current Finance profile (latest: 1.2.0). "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Finance data-model profile 1.0.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "finance-1.0.0" ; rdfs:comment "IMMUTABLE version IRI. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Finance data-model profile 1.1.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.1.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "finance-1.1.0" ; rdfs:comment "IMMUTABLE version IRI. ADDITIVE over 1.0.0: adds the Budget + BudgetCategory (envelope) shapes for the Actual Budget use case. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Finance data-model profile 1.2.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.2.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "finance-1.2.0" ; rdfs:comment "IMMUTABLE version IRI. ADDITIVE over 1.1.0: adds the double-entry LEDGER shapes (LedgerAccount/JournalEntry/LedgerEntry — Keystone) and the private-equity shapes (Fund/Commitment/Notice — CapNote). Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . diff --git a/packages/solid-federation-vocab/sectors/finance/finance.ttl b/packages/solid-federation-vocab/sectors/finance/finance.ttl index 1f4ed1a8c..419633777 100644 --- a/packages/solid-federation-vocab/sectors/finance/finance.ttl +++ b/packages/solid-federation-vocab/sectors/finance/finance.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix fin: . -@prefix core: . +@prefix fin: . +@prefix core: . @prefix gufo: . @prefix owl: . @prefix rdf: . @@ -51,15 +51,15 @@ # # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Finance Sector Ontology (gUFO re-base)"@en ; rdfs:label "Solid Finance Sector Ontology"@en ; vann:preferredNamespacePrefix "fin" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/finance#" ; - owl:imports , - ; - owl:versionInfo "1.2.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/finance#" ; + owl:imports , + ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """Personal-finance terms (accounts, transactions, holdings, payments) for the EDMA lending/banking use cases, re-based onto the gUFO Solid Core. Account=Relator(+Phase status); transactions/payments @@ -79,8 +79,8 @@ CapNote's capital calls & distributions, and fin:sharePct (the honest percentage datatype replacing Keystone's range-violating bare-literal qudt:quantityValue) + fin:jurisdiction. Generic double-entry + PE terms, - aligned to FIBO Mode-A (finance-alignments.ttl); no existing term changed."""@en ; - dcterms:modified "2026-07-03"^^xsd:date ; + aligned to FIBO Mode-A (finance-alignments.ttl); no existing term changed. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2. v1.2.0 ADDITIVE: double-entry ledger (Keystone) + private-equity capital-calls/distributions (CapNote) + fin:sharePct/jurisdiction. See the revenue-products ontology review §4–§5."@en . # ----------------------------------------------------------------------------- @@ -688,13 +688,13 @@ fin:jurisdiction a owl:DatatypeProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Finance sector"@en ; rdfs:comment "The Finance data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over finance data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Finance"@en . diff --git a/packages/solid-federation-vocab/sectors/finance/imports/fibo-slim.ttl b/packages/solid-federation-vocab/sectors/finance/imports/fibo-slim.ttl index 3a76774b8..39a5c0cd8 100644 --- a/packages/solid-federation-vocab/sectors/finance/imports/fibo-slim.ttl +++ b/packages/solid-federation-vocab/sectors/finance/imports/fibo-slim.ttl @@ -42,12 +42,13 @@ # these terms (rdfs:subClassOf) in finance-alignments.ttl. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; dcterms:title "FIBO slim MIREOT module for the Solid finance sector"@en ; - owl:versionInfo "fibo-2026-06-13-slim" ; - owl:versionIRI ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:source ; - dcterms:modified "2026-06-13"^^ ; + dcterms:modified "2026-10-25"^^ ; rdfs:comment "Slim Mode-B MIREOT extract of FIBO (robot extract --method mireot), version-pinned to the 2026-06-13 master/latest snapshot. Curated to be self-contained: dangling OMG-Commons/BE upper references removed."@en . # Annotation-property declarations (F5 DL hygiene): the title/source/modified and the FIBO diff --git a/packages/solid-federation-vocab/sectors/futures/catalog-v001.xml b/packages/solid-federation-vocab/sectors/futures/catalog-v001.xml index 92918de83..582ec02f0 100644 --- a/packages/solid-federation-vocab/sectors/futures/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/futures/catalog-v001.xml @@ -23,12 +23,11 @@ - - - + + + - - - - + + + diff --git a/packages/solid-federation-vocab/sectors/futures/futures-alignments.ttl b/packages/solid-federation-vocab/sectors/futures/futures-alignments.ttl index f38b6b2f4..4f45a81ca 100644 --- a/packages/solid-federation-vocab/sectors/futures/futures-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/futures/futures-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Fable 5 (PSS agent) # -@prefix fut: . -@prefix core: . +@prefix fut: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix rdf: . @@ -50,10 +50,12 @@ # Recommendation-track, referenced by their published term IRIs. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Futures sector — external alignments"@en ; - owl:imports ; - owl:versionInfo "0.2.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; rdfs:comment "Optional Mode-A bridge: ActivityStreams 2.0 reaction/event terms, PROV-O activity framing, ODRL 2.2 profiled actions, VC 2.0 credential class, the shared task model's wf: terms, and scheme-level literature anchors for the Max-Neef and Schwartz seeds. External IRIs are real and governed by their bodies. Nothing is owl:imported into the reasoned closure. v0.2.0 adds the fedreg: anchors for the adoption machinery."@en . dcterms:title a owl:AnnotationProperty . @@ -117,8 +119,8 @@ fut:implementationTracker rdfs:seeAlso wf:Tracker . # storage-description resource the claim is re-checked against. Annotation # only (rdfs:seeAlso) — fedreg: is not owl:imported into the reasoned closure. # ----------------------------------------------------------------------------- -fut:AdoptionObservation rdfs:seeAlso . -fut:observationSource rdfs:seeAlso . +fut:AdoptionObservation rdfs:seeAlso . +fut:observationSource rdfs:seeAlso . # ----------------------------------------------------------------------------- # LITERATURE ANCHORS — scheme level only (see header note). diff --git a/packages/solid-federation-vocab/sectors/futures/futures-examples.ttl b/packages/solid-federation-vocab/sectors/futures/futures-examples.ttl index 5e67dddbc..73de599d2 100644 --- a/packages/solid-federation-vocab/sectors/futures/futures-examples.ttl +++ b/packages/solid-federation-vocab/sectors/futures/futures-examples.ttl @@ -17,8 +17,8 @@ # shape; 17–19 exercise the scope-B InfraProposal / AdoptionObservation / # AdoptionDecision shapes. # -@prefix fut: . -@prefix core: . +@prefix fut: . +@prefix core: . @prefix as: . @prefix dct: . @prefix prov: . @@ -218,7 +218,7 @@ town:infra-01 a fut:InfraProposal ; dct:title "Adopt futures sector 0.2.0" ; as:content "Bump the deliberation vocabulary to 0.2.0 so critiques and infrastructure proposals are first-class data." ; fut:motivatedBy ; - fut:targetsSystem ; + fut:targetsSystem ; fut:proposalKind fut:SpecChange ; fut:affectsRole fut:ImplementerRole , fut:OperatorRole ; fut:breakingChange false ; @@ -232,7 +232,7 @@ town:infra-01 a fut:InfraProposal ; # (a cache, never authoritative: re-checked at the observationSource). town:obs-01 a fut:AdoptionObservation ; fut:observedParty ; - fut:observedVersion ; + fut:observedVersion ; fut:observedAt "2026-07-03T08:00:00Z"^^xsd:dateTime ; fut:observationSource . @@ -241,7 +241,7 @@ town:obs-01 a fut:AdoptionObservation ; # is MEASURED from evidence against the stated bar, never decreed. town:adopt-01 a fut:AdoptionDecision ; as:content "We recommend adopting futures sector 0.2.0 for the town's deliberation data." ; - fut:proposesVersion ; + fut:proposesVersion ; fut:adoptionBar "≥2 independent implementations and ≥2 communities advertising the version via fedreg:acceptsSpec." ; fut:adoptionEvidence town:obs-01 ; fut:methodProvenance fut:resonanceMapping ; diff --git a/packages/solid-federation-vocab/sectors/futures/futures.shacl.ttl b/packages/solid-federation-vocab/sectors/futures/futures.shacl.ttl index 3c9e24d50..3c196286a 100644 --- a/packages/solid-federation-vocab/sectors/futures/futures.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/futures/futures.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Fable 5 (PSS agent) # -@prefix fut: . -@prefix fsh: . -@prefix core: . +@prefix fut: . +@prefix fsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -76,46 +76,46 @@ # compose prompt). # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Futures data-model profile (version-independent)"@en ; - dcterms:hasVersion , - ; + dcterms:hasVersion , + ; dcterms:description "Resolves to the current Futures sector profile version (latest: 0.2.0)."@en . - + a prof:Profile ; dcterms:title "Solid Futures data-model profile"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "0.1.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-futures-0.1.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for the futures sector; the version implementations pin via fedreg:acceptsSpec."@en . - + a prof:Profile ; dcterms:title "Solid Futures data-model profile 0.2.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "0.2.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-futures-0.2.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "IMMUTABLE version IRI. ADDITIVE over 0.1.0 (the unite S1 futures-0.2.0 draft, formalised): the scope-B InfraProposal + AdoptionDecision/AdoptionObservation shapes, the Convergence-Room Critique shape, and the methodProvenance / indirectStakeholders constraints. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD."@en . diff --git a/packages/solid-federation-vocab/sectors/futures/futures.ttl b/packages/solid-federation-vocab/sectors/futures/futures.ttl index b8cfec940..3a2885adb 100644 --- a/packages/solid-federation-vocab/sectors/futures/futures.ttl +++ b/packages/solid-federation-vocab/sectors/futures/futures.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Fable 5 (PSS agent) # -@prefix fut: . -@prefix core: . +@prefix fut: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -67,7 +67,7 @@ # them without a coordinated unite migration (fedreg:acceptsSpec is the # migration substrate). # -# NAMESPACE GOVERNANCE (design/01 note): seeding under w3id.org/jeswr mirrors +# NAMESPACE GOVERNANCE (design/01 note): seeding under jeswr.org/ns mirrors # how every sector bootstrapped, but unite's design/04 specifies a migration # path to a steward-circle-governed namespace once adoption warrants it — # hence the 0.x version line (now 0.2.0), not 1.0.0. @@ -81,14 +81,14 @@ # in axioms are declared as punned owl terms. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Futures Sector Ontology"@en ; rdfs:label "Solid Futures Sector Ontology"@en ; vann:preferredNamespacePrefix "fut" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/futures#" ; - owl:imports ; - owl:versionInfo "0.2.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/futures#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The participatory-democracy / shared-futures deliberation data sector for the unite platform (jeswr/unite): expression-layer statements (life context, vision, claim, need, @@ -111,8 +111,8 @@ critique unit (fut:Critique) + the VSD prompt (fut:indirectStakeholders). No 0.1.0 term changed; fut:onStatement's rdfs:domain was WIDENED (removed) because Critique reuses it — the - section-6 multi-class-property rule."""@en ; - dcterms:modified "2026-07-04"^^xsd:date ; + section-6 multi-class-property rule. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Sector ontology for unite Stage-1 (design/01-data-model.md). Version 0.2.0 is the ADDITIVE delta unite's S1 build drafted (its ratification is the first scope-B deliberation — unite SCOPE-DIFFERENTIATION §3.1 B4); the namespace-governance migration to a steward-circle namespace remains a documented follow-on (unite design/04), carried by fedreg:acceptsSpec dual-advertisement."@en . # ----------------------------------------------------------------------------- @@ -964,9 +964,9 @@ fut:kThreshold a odrl:LeftOperand, skos:Concept ; # skos:Concept in the federation sector register; dereferences to this ontology. # ============================================================================= - + a skos:Concept ; rdfs:label "Futures sector"@en ; rdfs:comment "The Futures (participatory-democracy / shared-futures deliberation) data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over deliberation data — the sector the unite platform declares. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Futures"@en . diff --git a/packages/solid-federation-vocab/sectors/health/catalog-v001.xml b/packages/solid-federation-vocab/sectors/health/catalog-v001.xml index 35783dd25..37207f5f4 100644 --- a/packages/solid-federation-vocab/sectors/health/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/health/catalog-v001.xml @@ -22,13 +22,13 @@ - - - + + + - - - + + + - + diff --git a/packages/solid-federation-vocab/sectors/health/diet/catalog-v001.xml b/packages/solid-federation-vocab/sectors/health/diet/catalog-v001.xml index dc564ef2e..7c454ea3d 100644 --- a/packages/solid-federation-vocab/sectors/health/diet/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/health/diet/catalog-v001.xml @@ -25,17 +25,17 @@ - - - + + + - - - + + + - + - - - + + + diff --git a/packages/solid-federation-vocab/sectors/health/diet/diet-alignments.ttl b/packages/solid-federation-vocab/sectors/health/diet/diet-alignments.ttl index 327767076..476ccd75a 100644 --- a/packages/solid-federation-vocab/sectors/health/diet/diet-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/health/diet/diet-alignments.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix diet: . -@prefix health: . -@prefix core: . +@prefix diet: . +@prefix health: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix rdf: . @@ -41,10 +41,12 @@ # app's exposure derivation actually reads). # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Health Diet sub-sector — external alignments"@en ; - owl:imports ; - owl:versionInfo "1.0.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; rdfs:comment "Optional Mode-A bridge: schema.org food/meal terms, SNOMED CT + LOINC symptom concepts, ChEBI + Monash-FODMAP trigger substances, and Open Food Facts allergen/additive taxonomy. External IRIs are real and governed by their bodies. Nothing is owl:imported into the reasoned closure."@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/sectors/health/diet/diet-examples.ttl b/packages/solid-federation-vocab/sectors/health/diet/diet-examples.ttl index 34682f712..1e960e46f 100644 --- a/packages/solid-federation-vocab/sectors/health/diet/diet-examples.ttl +++ b/packages/solid-federation-vocab/sectors/health/diet/diet-examples.ttl @@ -5,9 +5,9 @@ # (data = this file + diet.ttl for the coded-value class typing; shapes = # diet.shacl.ttl). Parsed for well-formedness by the ontology gate (Layer 1). # -@prefix diet: . -@prefix health: . -@prefix core: . +@prefix diet: . +@prefix health: . +@prefix core: . @prefix schema: . @prefix ex: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/sectors/health/diet/diet-negative-examples.ttl b/packages/solid-federation-vocab/sectors/health/diet/diet-negative-examples.ttl index 872233dfa..fc6ad24db 100644 --- a/packages/solid-federation-vocab/sectors/health/diet/diet-negative-examples.ttl +++ b/packages/solid-federation-vocab/sectors/health/diet/diet-negative-examples.ttl @@ -14,7 +14,7 @@ # out-of-band (this repo has no rdf-validate-shacl dep — the automated SHACL gate # lives in the health-diary vitest over the byte-identical shape). # -@prefix diet: . +@prefix diet: . @prefix ex: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/sectors/health/diet/diet.shacl.ttl b/packages/solid-federation-vocab/sectors/health/diet/diet.shacl.ttl index d6f926f19..47cd0b966 100644 --- a/packages/solid-federation-vocab/sectors/health/diet/diet.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/health/diet/diet.shacl.ttl @@ -1,9 +1,9 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix diet: . -@prefix dsh: . -@prefix health: . -@prefix core: . +@prefix diet: . +@prefix dsh: . +@prefix health: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -42,26 +42,26 @@ # cannot assert the ABSENCE of an undefined property, so it is a design note here. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Health Diet data-model profile (version-independent)"@en ; dcterms:description "Resolves to the current Diet sub-sector profile version."@en . - + a prof:Profile ; dcterms:title "Solid Health Diet data-model profile"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-health-diet-1.0.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for the diet sub-sector; MUSTs follow the 'what + when' frictionless-logging rule."@en . diff --git a/packages/solid-federation-vocab/sectors/health/diet/diet.ttl b/packages/solid-federation-vocab/sectors/health/diet/diet.ttl index db5d43149..32ad9743f 100644 --- a/packages/solid-federation-vocab/sectors/health/diet/diet.ttl +++ b/packages/solid-federation-vocab/sectors/health/diet/diet.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix diet: . -@prefix health: . -@prefix core: . +@prefix diet: . +@prefix health: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -61,15 +61,15 @@ # external terms referenced in axioms are declared as punned owl terms. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Health Diet sub-sector Ontology"@en ; rdfs:label "Solid Health Diet sub-sector Ontology"@en ; vann:preferredNamespacePrefix "diet" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/health/diet#" ; - owl:imports , - ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/health/diet#" ; + owl:imports , + ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The nutrition & multi-intolerance food-diary domain for the coeliac & multi-intolerance app (@jeswr/solid-health-diary): meals and food items (with Open Food Facts allergen/trace/additive/category tags), @@ -79,8 +79,8 @@ conclusions, on-device-summarised HLA-DQ genetics, and the working diet plan. A sub-sector of the health sector; aligns Mode-A to schema.org FoodEvent/NutritionInformation, SNOMED CT / LOINC symptom concepts and FODMAP - concepts in diet-alignments.ttl."""@en ; - dcterms:modified "2026-07-03"^^xsd:date ; + concepts in diet-alignments.ttl. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Sub-sector of the health sector (sectors/health). Decision support, not diagnosis — the app never asserts a disease; that framing is carried in the confidence + interpretation data."@en . # ----------------------------------------------------------------------------- @@ -904,10 +904,10 @@ diet:clinicalReport a diet:GeneticSourceType, skos:Concept ; # to this ontology. # ============================================================================= - + a skos:Concept ; rdfs:label "Diet sub-sector"@en ; rdfs:comment "The Diet (nutrition / food-intolerance) sub-sector of the Health sector. The value a food-diary app's fedapp:sector names in its Client Identifier Document. Backed by this sub-sector ontology; narrower than the Health sector."@en ; - rdfs:isDefinedBy ; - skos:broader ; + rdfs:isDefinedBy ; + skos:broader ; skos:prefLabel "Diet"@en . diff --git a/packages/solid-federation-vocab/sectors/health/health-alignments.ttl b/packages/solid-federation-vocab/sectors/health/health-alignments.ttl index da8100533..2acf537de 100644 --- a/packages/solid-federation-vocab/sectors/health/health-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/health/health-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix health: . -@prefix core: . +@prefix health: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix rdf: . @@ -52,10 +52,12 @@ # FHIR since fhir.ttl is not imported and its axioms are not in the closure). # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; dcterms:title "Solid Health Sector Ontology — external alignments (gUFO re-base)"@en ; - owl:imports ; - owl:versionInfo "1.0.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; rdfs:comment "Optional Mode-A bridge to FHIR R4/R5, SNOMED CT, LOINC + Mode-B QUDT/UCUM unit binding + IDMP-O. External IRIs are real and subject to their bodies' governance. fhir.ttl is deliberately NOT imported."@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/sectors/health/health.shacl.ttl b/packages/solid-federation-vocab/sectors/health/health.shacl.ttl index 338465c0d..6570be6b9 100644 --- a/packages/solid-federation-vocab/sectors/health/health.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/health/health.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix health: . -@prefix hsh: . -@prefix core: . +@prefix health: . +@prefix hsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdf: . @@ -32,26 +32,26 @@ # v1.0.0 tracks the gUFO re-base of health.ttl. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Health data-model profile (version-independent)"@en ; dcterms:description "Resolves to the current Health profile version."@en . - + a prof:Profile ; dcterms:title "Solid Health data-model profile (gUFO re-base)"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "solid-health-1.0.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile, MUST/SHOULD grades derived from FHIR R4/R5 StructureDefinitions. "@en . diff --git a/packages/solid-federation-vocab/sectors/health/health.ttl b/packages/solid-federation-vocab/sectors/health/health.ttl index 3a40c6653..82115fa26 100644 --- a/packages/solid-federation-vocab/sectors/health/health.ttl +++ b/packages/solid-federation-vocab/sectors/health/health.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix health: . -@prefix core: . +@prefix health: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -59,15 +59,15 @@ # # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Health Sector Ontology (gUFO re-base)"@en ; rdfs:label "Solid Health Sector Ontology"@en ; vann:preferredNamespacePrefix "health" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/health#" ; - owl:imports , - ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/health#" ; + owl:imports , + ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """Personal health records for the apple-health-import app and the EDMA patient-records use case, re-based onto the gUFO Solid Core. Patient=RoleMixin of core:Person; observations/conditions/medication- @@ -76,8 +76,8 @@ the Apple Health types) carry a value + a QUDT/UCUM unit. Aligns to FHIR R4/R5 (Mode A, no fhir.ttl import) and SNOMED CT / LOINC concept IRIs in the companion health-alignments.ttl; reuses QUDT for units via a slim - Mode-B module. v1.0.0 is a BREAKING re-base of v0."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + Mode-B module. v1.0.0 is a BREAKING re-base of v0. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2 (HEALTH row)."@en . # ----------------------------------------------------------------------------- @@ -326,13 +326,13 @@ health:resultsIn a owl:ObjectProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Health sector"@en ; rdfs:comment "The Health data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over health data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Health"@en . diff --git a/packages/solid-federation-vocab/sectors/health/imports/qudt-health-slim.ttl b/packages/solid-federation-vocab/sectors/health/imports/qudt-health-slim.ttl index aa9e6b529..28f292952 100644 --- a/packages/solid-federation-vocab/sectors/health/imports/qudt-health-slim.ttl +++ b/packages/solid-federation-vocab/sectors/health/imports/qudt-health-slim.ttl @@ -36,12 +36,13 @@ # class references beyond the qudt: schema terms (resolved via the catalog). # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; dcterms:title "QUDT health slim module for the Solid health sector"@en ; - owl:versionInfo "qudt-2.1-2026-06-13-health-slim" ; - owl:versionIRI ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:source ; - dcterms:modified "2026-06-13"^^xsd:date ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Slim Mode-B curated extract of QUDT 2.1 (HeartRate + Beat-per-Minute), version-pinned 2026-06-13. Self-contained; the core QUDT-units slim supplies Length/Mass/Time. The QUDT schema is NOT owl:imported (its transitive vaem/dtype/coordinateSystems closure is not DL-reasonable); the qudt: meta-classes used are declared as punned owl:Class locally — the F5 fix the Core applies for time:TemporalEntity."@en . # --- annotation-property declarations (F5 DL hygiene) --- diff --git a/packages/solid-federation-vocab/sectors/identity/catalog-v001.xml b/packages/solid-federation-vocab/sectors/identity/catalog-v001.xml index b3ea933d7..1a11ca6e5 100644 --- a/packages/solid-federation-vocab/sectors/identity/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/identity/catalog-v001.xml @@ -22,11 +22,11 @@ - - - + + + - - - + + + diff --git a/packages/solid-federation-vocab/sectors/identity/identity-alignments.ttl b/packages/solid-federation-vocab/sectors/identity/identity-alignments.ttl index d4edcda03..530867beb 100644 --- a/packages/solid-federation-vocab/sectors/identity/identity-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/identity/identity-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix id: . -@prefix core: . +@prefix id: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -40,11 +40,12 @@ # collapse two distinct Core classes (contract §3). # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; dcterms:title "Solid Identity & Profile — external alignments (gUFO re-base)"@en ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to vcard / schema.org / ISO 3166 / eIDAS 2.0 PID. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/sectors/identity/identity.shacl.ttl b/packages/solid-federation-vocab/sectors/identity/identity.shacl.ttl index 5ebb7d6a9..eb4de8bc2 100644 --- a/packages/solid-federation-vocab/sectors/identity/identity.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/identity/identity.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix idsh: . -@prefix id: . -@prefix core: . +@prefix idsh: . +@prefix id: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -24,17 +24,17 @@ # v1.0.0 tracks the gUFO re-base of identity.ttl. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Identity & Profile data-model profile (gUFO re-base)"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "identity-1.0.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for identity & verified-claim data, re-based onto the gUFO Core. "@en . diff --git a/packages/solid-federation-vocab/sectors/identity/identity.ttl b/packages/solid-federation-vocab/sectors/identity/identity.ttl index 33f832d35..f85405c76 100644 --- a/packages/solid-federation-vocab/sectors/identity/identity.ttl +++ b/packages/solid-federation-vocab/sectors/identity/identity.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix id: . -@prefix core: . +@prefix id: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -40,14 +40,14 @@ # Open-world by default; the SHACL profile carries the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Identity & Profile Ontology (gUFO re-base)"@en ; rdfs:label "Solid Identity & Profile Ontology"@en ; vann:preferredNamespacePrefix "id" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/identity#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/identity#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """Personal identity & profile attributes for KYC reuse, tell-us-once, and verified claims, re-based onto the gUFO Core. Roots in core:Person (NaturalPerson SubKind), core:Identifier (the identifier @@ -56,8 +56,8 @@ structure as global abstract slots (§3.5) — no canonical 'the gender'. v1.0.0 is a BREAKING re-base of v0 (the meta-types change meaning), so a new MAJOR version. Aligns to vcard, schema:Person, ISO 3166 and the - eIDAS 2.0 PID attribute set in the companion alignments file."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + eIDAS 2.0 PID attribute set in the companion alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2/§3.5."@en . # ----------------------------------------------------------------------------- @@ -336,13 +336,13 @@ id:Pronouns a owl:Class, gufo:Kind ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Identity & Profile sector"@en ; rdfs:comment "The Identity & Profile data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over identity & profile data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Identity & Profile"@en . diff --git a/packages/solid-federation-vocab/sectors/media/catalog-v001.xml b/packages/solid-federation-vocab/sectors/media/catalog-v001.xml index 153883265..2d17fd155 100644 --- a/packages/solid-federation-vocab/sectors/media/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/media/catalog-v001.xml @@ -22,11 +22,11 @@ - - - + + + - - - + + + diff --git a/packages/solid-federation-vocab/sectors/media/media-alignments.ttl b/packages/solid-federation-vocab/sectors/media/media-alignments.ttl index cbdc6b235..b47092387 100644 --- a/packages/solid-federation-vocab/sectors/media/media-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/media/media-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix media: . -@prefix core: . +@prefix media: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -30,11 +30,12 @@ # media: never silently inherits schema.org's commitments. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; dcterms:title "Solid Media & Activity — external alignments (gUFO re-base)"@en ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to schema.org + a conceptual ODRL tie. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/sectors/media/media.shacl.ttl b/packages/solid-federation-vocab/sectors/media/media.shacl.ttl index 3c0549c21..563659921 100644 --- a/packages/solid-federation-vocab/sectors/media/media.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/media/media.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix mdsh: . -@prefix media: . -@prefix core: . +@prefix mdsh: . +@prefix media: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -25,17 +25,17 @@ # v1.0.0 tracks the gUFO re-base of media.ttl. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Media & Activity data-model profile (gUFO re-base)"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "media-1.0.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for media works, playback events and listening history, re-based onto the gUFO Core. "@en . diff --git a/packages/solid-federation-vocab/sectors/media/media.ttl b/packages/solid-federation-vocab/sectors/media/media.ttl index 958b4241b..f22fbc761 100644 --- a/packages/solid-federation-vocab/sectors/media/media.ttl +++ b/packages/solid-federation-vocab/sectors/media/media.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix media: . -@prefix core: . +@prefix media: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -11,7 +11,7 @@ @prefix vann: . @prefix gufo: . @prefix foaf: . -@prefix fedgen: . +@prefix fedgen: . # ============================================================================= # Solid Media & Activity sector ontology — RE-BASED onto gUFO (KEY=media). @@ -53,14 +53,14 @@ # endurant-domain media:recordingOf is rooted in core:about. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Media & Activity Ontology (gUFO re-base)"@en ; rdfs:label "Solid Media & Activity Ontology"@en ; vann:preferredNamespacePrefix "media" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/media#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/media#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """Media consumption & creative works — the Spotify end-to-end example and the media importers — re-based onto the gUFO Core. Roots in core:InformationResource/core:Asset (creative works), @@ -70,8 +70,8 @@ (the usage licence). v1.0.0 is a BREAKING re-base of v0 (the meta-types change meaning), so a new MAJOR version. Aligns to schema.org CreativeWork/MusicRecording/MusicGroup/Event and ODRL in the companion - alignments file."""@en ; - dcterms:modified "2026-06-13"^^xsd:date ; + alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2."@en . # ----------------------------------------------------------------------------- @@ -342,13 +342,13 @@ media:loved a owl:DatatypeProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Media & Activity sector"@en ; rdfs:comment "The Media & Activity data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over media & activity data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Media & Activity"@en . diff --git a/packages/solid-federation-vocab/sectors/scheduling/catalog-v001.xml b/packages/solid-federation-vocab/sectors/scheduling/catalog-v001.xml index 67ca33f34..773df0a00 100644 --- a/packages/solid-federation-vocab/sectors/scheduling/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/scheduling/catalog-v001.xml @@ -22,11 +22,11 @@ - - - + + + - - - + + + diff --git a/packages/solid-federation-vocab/sectors/scheduling/scheduling-alignments.ttl b/packages/solid-federation-vocab/sectors/scheduling/scheduling-alignments.ttl index e1ed85ef6..a1cc3b84c 100644 --- a/packages/solid-federation-vocab/sectors/scheduling/scheduling-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/scheduling/scheduling-alignments.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -35,12 +35,13 @@ # default to closeMatch — the conservative seam that keeps Core∪Sector clean. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; dcterms:title "Solid Scheduling — external alignments (gUFO re-base)"@en ; - owl:imports ; - owl:versionInfo "1.1.0" ; + owl:imports ; + owl:versionInfo "2.0.0" ; dcterms:modified "2026-10-25"^^xsd:date ; - owl:versionIRI ; + owl:versionIRI ; rdfs:comment "Mode-A thin alignments (separate file, not in the reasoned closure) to iCalendar (RFC 5545 / W3C cal:), schema.org and W3C OWL-Time. Reuse-before-mint. "@en . dcterms:title a owl:AnnotationProperty . diff --git a/packages/solid-federation-vocab/sectors/scheduling/scheduling.shacl.ttl b/packages/solid-federation-vocab/sectors/scheduling/scheduling.shacl.ttl index e8015cf1e..cbcc48428 100644 --- a/packages/solid-federation-vocab/sectors/scheduling/scheduling.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/scheduling/scheduling.shacl.ttl @@ -1,10 +1,10 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix schsh: . -@prefix sched: . +@prefix schsh: . +@prefix sched: . @prefix schema: . -@prefix core: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -26,18 +26,18 @@ # v1.1.0 adds all-day dates and schema.org recurrence selectors. # ============================================================================= - + a prof:Profile ; dcterms:title "Solid Scheduling data-model profile (gUFO re-base)"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.1.0" ; dcterms:modified "2026-10-25"^^xsd:date ; - owl:versionIRI ; - prof:isProfileOf ; + owl:versionIRI ; + prof:isProfileOf ; prof:hasToken "scheduling-1.1.0" ; prof:hasResource [ prof:hasRole ; - prof:hasArtifact + prof:hasArtifact ] ; rdfs:comment "Open-by-default SHACL profile for calendar/scheduling data, re-based onto the gUFO Core. Validates CalendarEvent, Task, Calendar, Attendance, RecurrenceRule and Reminder. "@en . diff --git a/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl b/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl index 03822ebb6..462973468 100644 --- a/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl +++ b/packages/solid-federation-vocab/sectors/scheduling/scheduling.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Codex GPT-6.1-Sol # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -49,14 +49,14 @@ # Open-world by default; the SHACL profile carries the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Scheduling Ontology (gUFO re-base)"@en ; rdfs:label "Solid Scheduling Ontology"@en ; vann:preferredNamespacePrefix "sched" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/scheduling#" ; - owl:imports ; - owl:versionInfo "1.1.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/scheduling#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """Calendars and scheduling (the Calendar app), re-based onto the gUFO Core. Roots CalendarEvent in core:Event, Task/ToDo in core:Activity, Calendar/RecurrenceRule/Reminder in core:InformationResource @@ -66,7 +66,7 @@ hadParticipant). v1.0.0 is a BREAKING re-base of v0 (the meta-types change meaning, and the v0 string-role relationship is replaced by a relator), so a new MAJOR version. Aligns to iCalendar RFC 5545, schema:Event/Schedule - and W3C OWL-Time in the companion alignments file."""@en ; + and W3C OWL-Time in the companion alignments file. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Re-based per R11 §4.2. v1.1.0 allows date or dateTime for entry start/end/due and recurrence until; date values mean all-day. The companion SHACL profile adds schema.org recurrence selectors."@en . @@ -385,13 +385,13 @@ sched:triggerOffset a owl:DatatypeProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. # ============================================================================= - + a ; rdfs:label "Scheduling sector"@en ; rdfs:comment "The Scheduling data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over scheduling data. Backed by this sector ontology."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Scheduling"@en . diff --git a/packages/solid-federation-vocab/sectors/social/catalog-v001.xml b/packages/solid-federation-vocab/sectors/social/catalog-v001.xml index b6733926f..838bf2535 100644 --- a/packages/solid-federation-vocab/sectors/social/catalog-v001.xml +++ b/packages/solid-federation-vocab/sectors/social/catalog-v001.xml @@ -22,11 +22,11 @@ - - - + + + - - - + + + diff --git a/packages/solid-federation-vocab/sectors/social/social-alignments.ttl b/packages/solid-federation-vocab/sectors/social/social-alignments.ttl index fc269a27a..dd5213ed9 100644 --- a/packages/solid-federation-vocab/sectors/social/social-alignments.ttl +++ b/packages/solid-federation-vocab/sectors/social/social-alignments.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix social: . -@prefix core: . +@prefix social: . +@prefix core: . @prefix owl: . @prefix rdfs: . @prefix skos: . @@ -30,9 +30,12 @@ # same social:Note shape chat-interop reconciles. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; + dcterms:description "Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."@en ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dcterms:title "Solid Social Sector Ontology — AS2 + SIOC + schema.org Mode-A alignments"@en ; - owl:imports ; + owl:imports ; rdfs:comment "Annotation-only (skos:*Match) bridges to ActivityStreams 2.0, SIOC and schema.org — the @jeswr/solid-chat-interop CanonicalMessage content model. No entailment. "@en . # --- Note <-> as:Note / sioc:Note (the canonical message/feed-item shape) --- diff --git a/packages/solid-federation-vocab/sectors/social/social.shacl.ttl b/packages/solid-federation-vocab/sectors/social/social.shacl.ttl index 3ecf9e42f..d9b2a1ca1 100644 --- a/packages/solid-federation-vocab/sectors/social/social.shacl.ttl +++ b/packages/solid-federation-vocab/sectors/social/social.shacl.ttl @@ -1,8 +1,8 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix social: . -@prefix socsh: . -@prefix core: . +@prefix social: . +@prefix socsh: . +@prefix core: . @prefix sh: . @prefix owl: . @prefix rdfs: . @@ -19,16 +19,16 @@ # Warning=SHOULD, Info=MAY); IMMUTABLE version IRI; additive. # ============================================================================= - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Social data-model profile (version-independent)"@en ; - dcterms:hasVersion ; + dcterms:hasVersion ; rdfs:comment "Version-independent IRI resolving to the current Social profile. "@en . - a prof:Profile ; + a prof:Profile ; dcterms:title "Solid Social data-model profile 1.0.0"@en ; - dcterms:isVersionOf ; + dcterms:isVersionOf ; owl:versionInfo "1.0.0" ; - prof:isProfileOf ; + prof:isProfileOf ; prof:hasToken "social-1.0.0" ; rdfs:comment "IMMUTABLE version IRI. Open shapes; sh:Violation=MUST, sh:Warning=SHOULD. "@en . diff --git a/packages/solid-federation-vocab/sectors/social/social.ttl b/packages/solid-federation-vocab/sectors/social/social.ttl index 1afb6da3f..9092125c3 100644 --- a/packages/solid-federation-vocab/sectors/social/social.ttl +++ b/packages/solid-federation-vocab/sectors/social/social.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # -@prefix social: . -@prefix core: . +@prefix social: . +@prefix core: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @@ -21,7 +21,7 @@ # # THIS SECTOR ALSO REPAIRS A DANGLING REFERENCE: @jeswr/pod-chat's # clientid.jsonld already names fedapp:sector -# , which until now did not resolve +# , which until now did not resolve # (the sector was flagged "not yet authored" in the README). Authoring it here # fixes that reference. # @@ -40,14 +40,14 @@ # the closed-world MUST/SHOULD. # ============================================================================= - a owl:Ontology ; + a owl:Ontology ; dcterms:title "Solid Social, Fediverse & Feed Sector Ontology"@en ; rdfs:label "Solid Social, Fediverse & Feed Sector Ontology"@en ; vann:preferredNamespacePrefix "social" ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/sectors/social#" ; - owl:imports ; - owl:versionInfo "1.0.0" ; - owl:versionIRI ; + vann:preferredNamespaceUri "https://jeswr.org/ns/sectors/social#" ; + owl:imports ; + owl:versionInfo "2.0.0" ; + owl:versionIRI ; dcterms:description """The social / fediverse / feed data sector — the domain a federated Elk (Mastodon/ActivityPub) client, a Miniflux (RSS/Atom) reader, and @jeswr/pod-chat operate in. Authors the sector marker and gUFO-rooted @@ -56,8 +56,8 @@ spine. Built on ActivityStreams 2.0 (as:Note/as:Collection) + SIOC and aligned to @jeswr/solid-chat-interop's CanonicalMessage (whose content model is AS2) in the companion alignments file. Authoring this sector also repairs - the dangling fedapp:sector reference in @jeswr/pod-chat's clientid."""@en ; - dcterms:modified "2026-06-21"^^xsd:date ; + the dangling fedapp:sector reference in @jeswr/pod-chat's clientid. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; + dcterms:modified "2026-10-25"^^xsd:date ; rdfs:comment "Foundation sector for the 5-OSS-fork initiative (Elk + Miniflux); repairs the pod-chat dangling reference."@en . # ----------------------------------------------------------------------------- @@ -146,14 +146,14 @@ social:published a owl:DatatypeProperty ; # ============================================================================= # SECTOR MARKER — the IRI an app's fedapp:sector points at to declare it operates -# in this sector (https://w3id.org/jeswr/fed#sector). A skos:Concept in the +# in this sector (https://jeswr.org/ns/fed#sector). A skos:Concept in the # federation sector register; dereferences to this ontology. THIS is the IRI # @jeswr/pod-chat's clientid.jsonld already references. # ============================================================================= - + a ; rdfs:label "Social, Fediverse & Feed sector"@en ; rdfs:comment "The Social, Fediverse & Feed data sector. The value an app's fedapp:sector names in its Client Identifier Document to declare it operates over social / fediverse / feed data (toots, posts, chat messages, RSS entries). Backed by this sector ontology. Already referenced by @jeswr/pod-chat's clientid."@en ; - rdfs:isDefinedBy ; + rdfs:isDefinedBy ; skos:prefLabel "Social, Fediverse & Feed"@en . diff --git a/packages/solid-federation-vocab/task-context.jsonld b/packages/solid-federation-vocab/task-context.jsonld index 96f98ed84..8306e22dc 100644 --- a/packages/solid-federation-vocab/task-context.jsonld +++ b/packages/solid-federation-vocab/task-context.jsonld @@ -3,7 +3,7 @@ "@version": 1.1, "@protected": true, - "tm": "https://w3id.org/jeswr/task#", + "tm": "https://jeswr.org/ns/task#", "wf": "http://www.w3.org/2005/01/wf/flow#", "dct": "http://purl.org/dc/terms/", "as": "https://www.w3.org/ns/activitystreams#", diff --git a/packages/solid-federation-vocab/task.ttl b/packages/solid-federation-vocab/task.ttl index 0a45d5dba..cf8ca5fea 100644 --- a/packages/solid-federation-vocab/task.ttl +++ b/packages/solid-federation-vocab/task.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Claude Opus 4.8 (Fable unavailable) — re-review/upgrade candidate # # Shared Cross-App Task / Issue Model (the federation task vocabulary) -# Namespace: https://w3id.org/jeswr/task# (ADR-0013; beads pss-tof + pss-74i) +# Namespace: https://jeswr.org/ns/task# (ADR-0013; beads pss-tof + pss-74i) # # This is NOT a new ontology of task terms — it is the canonical, dereferenceable # RE-USE of established vocabularies (the SolidOS W3C workflow ontology `wf:`, @@ -12,7 +12,7 @@ # that agreement so the @context (task-context.jsonld) has a stable home and the # shared terms resolve. -@prefix tm: . +@prefix tm: . @prefix wf: . @prefix dct: . @prefix as: . @@ -23,8 +23,9 @@ @prefix vann: . @prefix xsd: . - - a owl:Ontology ; + a owl:Ontology ; + owl:versionIRI ; + owl:versionInfo "2.0.0" ; dct:title "Shared Cross-App Task / Issue Model"@en ; dct:description """The canonical, dereferenceable re-use of the W3C workflow ontology (wf:), Dublin Core Terms (dct:) and ActivityStreams 2.0 (as:) @@ -36,13 +37,13 @@ a wf:State), and an event-condition-action automation model (tm:Rule + tm:trigger / tm:condition / tm:action) for client-evaluated 'when X then Y' tracker rules, reusing odrl:Constraint for the - condition."""@en ; + condition. Version 2.0.0 rebases this ontology from its legacy w3id namespace to https://jeswr.org/ns/ (DECISIONS V1)."""@en ; dct:creator "Claude Opus 4.8 (@jeswr PSS agent)" ; dct:issued "2026-06-15"^^xsd:date ; - dct:modified "2026-06-17"^^xsd:date ; - vann:preferredNamespaceUri "https://w3id.org/jeswr/task#" ; + dct:modified "2026-10-25"^^xsd:date ; + vann:preferredNamespaceUri "https://jeswr.org/ns/task#" ; vann:preferredNamespacePrefix "tm" ; - rdfs:seeAlso ; + rdfs:seeAlso ; rdfs:comment "Experimental — AI-agent-generated; under active development, not production-hardened."@en . # --------------------------------------------------------------------------- @@ -132,7 +133,7 @@ tm:wipMin no lower bound. A non-negative integer."""@en ; rdfs:domain wf:State ; rdfs:range xsd:nonNegativeInteger ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:wipMax a rdf:Property, owl:DatatypeProperty ; @@ -146,7 +147,7 @@ tm:wipMax integer."""@en ; rdfs:domain wf:State ; rdfs:range xsd:nonNegativeInteger ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . # =========================================================================== # tm: extension 2 — automation rules: event-condition-action ("when X then Y") @@ -176,7 +177,7 @@ tm:Rule Rules are persisted in the pod and evaluated CLIENT-side whenever fresh issue state is observed (pods have no server-side compute). The Jira/Monday automation model expressed in RDF."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:Trigger a rdfs:Class, owl:Class ; @@ -186,7 +187,7 @@ tm:Trigger tm:OnDueDatePassed, tm:OnAllSubtasksDone, tm:OnAssigned, tm:OnCreated. A trigger may carry refining data (e.g. the target status of a status-change) on app-defined properties; the coded value identifies the event class."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:Action a rdfs:Class, owl:Class ; @@ -197,7 +198,7 @@ tm:Action tm:AddComment, tm:CloseIssue. An action carries its parameter via tm:actionValue (e.g. the priority to set, the status slug, the assignee WebID, the comment body). The mutation is applied client-side."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:rule a rdf:Property, owl:ObjectProperty ; @@ -206,7 +207,7 @@ tm:rule set of rules a tracker's collaborators evaluate client-side."""@en ; rdfs:domain wf:Tracker ; rdfs:range tm:Rule ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:trigger a rdf:Property, owl:ObjectProperty ; @@ -217,7 +218,7 @@ tm:trigger rule."""@en ; rdfs:domain tm:Rule ; rdfs:range tm:Trigger ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:condition a rdf:Property, owl:ObjectProperty ; @@ -230,7 +231,7 @@ tm:condition with no condition fires whenever its trigger fires)."""@en ; rdfs:domain tm:Rule ; rdfs:range odrl:Constraint ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:action a rdf:Property, owl:ObjectProperty ; @@ -241,7 +242,7 @@ tm:action rule may carry several actions, all applied client-side."""@en ; rdfs:domain tm:Rule ; rdfs:range tm:Action ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:actionValue a rdf:Property ; @@ -253,7 +254,7 @@ tm:actionValue rdfs:range so it can hold either. Some actions (e.g. tm:CloseIssue) need no value."""@en ; rdfs:domain tm:Action ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . # --- coded-value triggers (instances of tm:Trigger) ------------------------- @@ -263,14 +264,14 @@ tm:OnStatusChange rdfs:comment """Trigger: an issue's workflow status changed. Pair with a tm:condition over the new status (an odrl:Constraint whose left-operand is the issue's status) to fire only on a specific transition."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:OnDueDatePassed a tm:Trigger ; rdfs:label "on due date passed"@en ; rdfs:comment """Trigger: an open issue's due date has passed (it is overdue). The basis for the built-in 'escalate overdue issues' automation."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:OnAllSubtasksDone a tm:Trigger ; @@ -278,19 +279,19 @@ tm:OnAllSubtasksDone rdfs:comment """Trigger: every sub-task of a parent issue has reached a terminal (closed) state. The basis for the built-in 'complete parents automatically' automation."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:OnAssigned a tm:Trigger ; rdfs:label "on assigned"@en ; rdfs:comment """Trigger: an issue was (re)assigned (its wf:assignee changed)."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:OnCreated a tm:Trigger ; rdfs:label "on created"@en ; rdfs:comment """Trigger: a new issue was created in the tracker."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . # --- coded-value actions (instances of tm:Action) --------------------------- @@ -299,35 +300,35 @@ tm:SetStatus rdfs:label "set status"@en ; rdfs:comment """Action: move the issue to a workflow status. The target status slug is carried on tm:actionValue."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:SetPriority a tm:Action ; rdfs:label "set priority"@en ; rdfs:comment """Action: set the issue's priority. The target priority is carried on tm:actionValue (e.g. \"high\")."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:Assign a tm:Action ; rdfs:label "assign"@en ; rdfs:comment """Action: set the issue's wf:assignee. The assignee WebID (an IRI) is carried on tm:actionValue."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:AddComment a tm:Action ; rdfs:label "add comment"@en ; rdfs:comment """Action: add a comment to the issue. The comment body literal is carried on tm:actionValue."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . tm:CloseIssue a tm:Action ; rdfs:label "close issue"@en ; rdfs:comment """Action: close the issue (move it to the workflow's terminal status). Needs no tm:actionValue."""@en ; - rdfs:isDefinedBy . + rdfs:isDefinedBy . # --- the re-used ODRL constraint shape (defined by odrl:, restated here) ----- # tm:condition's value is an odrl:Constraint. These are re-used, NOT minted — diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-event.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-event.ttl index 6f00ec599..349a3d30f 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-event.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-event.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-task.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-task.ttl index 016ec28a1..6e04c43c4 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-task.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/all-day-task.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/by-day-blank.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/by-day-blank.invalid.ttl index 6fe006f29..88c068fe9 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/by-day-blank.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/by-day-blank.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/by-day.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/by-day.invalid.ttl index c5ad0be21..633cf3e9f 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/by-day.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/by-day.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-0.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-0.invalid.ttl index fbfba062d..4d51f2521 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-0.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-0.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-1.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-1.invalid.ttl index 2b824eafd..80f7ba424 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-1.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-1.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-2.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-2.invalid.ttl index 151a41e7e..0310c6726 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-2.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonth-2.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-0.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-0.invalid.ttl index a38159271..4f098e66d 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-0.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-0.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-1.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-1.invalid.ttl index d1e390088..a1744e19f 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-1.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-1.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-2.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-2.invalid.ttl index 53bf7dc03..d64f87e06 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-2.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-2.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-3.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-3.invalid.ttl index 6603e9230..30546e035 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-3.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-3.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-4.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-4.invalid.ttl index d5977f854..a46dab4c6 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-4.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/byMonthDay-4.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/datetime.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/datetime.ttl index 6c62fd07f..4ec8384ac 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/datetime.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/datetime.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/due-time.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/due-time.invalid.ttl index c082603f3..ae646b536 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/due-time.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/due-time.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/end-time.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/end-time.invalid.ttl index 570c3c881..a6f60e168 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/end-time.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/end-time.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/except-date.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/except-date.invalid.ttl index b4ccb2622..2e98b6879 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/except-date.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/except-date.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-monday.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-monday.ttl index ea3c68ecc..e556ba68e 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-monday.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-monday.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-selectors.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-selectors.ttl index b75f45edc..6d3bf9fda 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-selectors.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/recurrence-selectors.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/start-time.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/start-time.invalid.ttl index aed9d24ad..d9b1dfeff 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/start-time.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/start-time.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/until.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/until.invalid.ttl index a06371e2e..7b65e1044 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/until.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/until.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/valid-from.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/valid-from.invalid.ttl index 2b699900d..cd2cfd1b2 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/valid-from.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/valid-from.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/test/fixtures/scheduling/valid-until.invalid.ttl b/packages/solid-federation-vocab/test/fixtures/scheduling/valid-until.invalid.ttl index 0f6566501..fb25e7f9b 100644 --- a/packages/solid-federation-vocab/test/fixtures/scheduling/valid-until.invalid.ttl +++ b/packages/solid-federation-vocab/test/fixtures/scheduling/valid-until.invalid.ttl @@ -1,7 +1,7 @@ # AUTHORED-BY Codex GPT-6.1-Sol @prefix ex: . -@prefix sched: . -@prefix core: . +@prefix sched: . +@prefix core: . @prefix schema: . @prefix xsd: . diff --git a/packages/solid-federation-vocab/verification/persistent-ids.tsv b/packages/solid-federation-vocab/verification/persistent-ids.tsv new file mode 100644 index 000000000..60a97072a --- /dev/null +++ b/packages/solid-federation-vocab/verification/persistent-ids.tsv @@ -0,0 +1,56 @@ +# AUTHORED-BY Codex GPT-6.1-Sol +# Checked 2026-10-25T21:59:28.582Z; registry https://raw.githubusercontent.com/jeswr/portfolio/main/config/persistent-ids.ts +# All 17 legacy predecessor fields retained; all 51 target files exist in local docs/. +slug representation status url final-url +fed turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/fed.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/fed.ttl +fed html 200 https://jeswr.github.io/solid-federation-vocab/fed.html https://jeswr.github.io/solid-federation-vocab/fed.html +fed jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/context.jsonld +fedreg turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/fedreg.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/fedreg.ttl +fedreg html 200 https://jeswr.github.io/solid-federation-vocab/fedreg.html https://jeswr.github.io/solid-federation-vocab/fedreg.html +fedreg jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/fedreg-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/fedreg-context.jsonld +task turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/task.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/task.ttl +task html 200 https://jeswr.github.io/solid-federation-vocab/task.html https://jeswr.github.io/solid-federation-vocab/task.html +task jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/task-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/task-context.jsonld +core turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/core.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/core.ttl +core html 200 https://jeswr.github.io/solid-federation-vocab/core.html https://jeswr.github.io/solid-federation-vocab/core.html +core jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/core-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/core-context.jsonld +sectors/bookmarks turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/bookmarks.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/bookmarks.ttl +sectors/bookmarks html 200 https://jeswr.github.io/solid-federation-vocab/sectors/bookmarks.html https://jeswr.github.io/solid-federation-vocab/sectors/bookmarks.html +sectors/bookmarks jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/bookmarks-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/bookmarks-context.jsonld +sectors/collectibles turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/collectibles.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/collectibles.ttl +sectors/collectibles html 200 https://jeswr.github.io/solid-federation-vocab/sectors/collectibles.html https://jeswr.github.io/solid-federation-vocab/sectors/collectibles.html +sectors/collectibles jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/collectibles-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/collectibles-context.jsonld +sectors/contacts turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/contacts.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/contacts.ttl +sectors/contacts html 200 https://jeswr.github.io/solid-federation-vocab/sectors/contacts.html https://jeswr.github.io/solid-federation-vocab/sectors/contacts.html +sectors/contacts jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/contacts-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/contacts-context.jsonld +sectors/drawing turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/drawing.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/drawing.ttl +sectors/drawing html 200 https://jeswr.github.io/solid-federation-vocab/sectors/drawing.html https://jeswr.github.io/solid-federation-vocab/sectors/drawing.html +sectors/drawing jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/drawing-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/drawing-context.jsonld +sectors/equine turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/equine.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/equine.ttl +sectors/equine html 200 https://jeswr.github.io/solid-federation-vocab/sectors/equine.html https://jeswr.github.io/solid-federation-vocab/sectors/equine.html +sectors/equine jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/equine-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/equine-context.jsonld +sectors/finance turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/finance.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/finance.ttl +sectors/finance html 200 https://jeswr.github.io/solid-federation-vocab/sectors/finance.html https://jeswr.github.io/solid-federation-vocab/sectors/finance.html +sectors/finance jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/finance-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/finance-context.jsonld +sectors/futures turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/futures.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/futures.ttl +sectors/futures html 200 https://jeswr.github.io/solid-federation-vocab/sectors/futures.html https://jeswr.github.io/solid-federation-vocab/sectors/futures.html +sectors/futures jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/futures-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/futures-context.jsonld +sectors/health turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/health.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/health.ttl +sectors/health html 200 https://jeswr.github.io/solid-federation-vocab/sectors/health.html https://jeswr.github.io/solid-federation-vocab/sectors/health.html +sectors/health jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/health-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/health-context.jsonld +sectors/identity turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/identity.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/identity.ttl +sectors/identity html 200 https://jeswr.github.io/solid-federation-vocab/sectors/identity.html https://jeswr.github.io/solid-federation-vocab/sectors/identity.html +sectors/identity jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/identity-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/identity-context.jsonld +sectors/media turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/media.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/media.ttl +sectors/media html 200 https://jeswr.github.io/solid-federation-vocab/sectors/media.html https://jeswr.github.io/solid-federation-vocab/sectors/media.html +sectors/media jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/media-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/media-context.jsonld +sectors/scheduling turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/scheduling.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/scheduling.ttl +sectors/scheduling html 200 https://jeswr.github.io/solid-federation-vocab/sectors/scheduling.html https://jeswr.github.io/solid-federation-vocab/sectors/scheduling.html +sectors/scheduling jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/scheduling-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/scheduling-context.jsonld +sectors/social turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/social.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/social.ttl +sectors/social html 200 https://jeswr.github.io/solid-federation-vocab/sectors/social.html https://jeswr.github.io/solid-federation-vocab/sectors/social.html +sectors/social jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/social-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/social-context.jsonld +sectors/health/diet turtle 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/health/diet.ttl https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/health/diet.ttl +sectors/health/diet html 200 https://jeswr.github.io/solid-federation-vocab/sectors/health/diet.html https://jeswr.github.io/solid-federation-vocab/sectors/health/diet.html +sectors/health/diet jsonld 200 https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/health/diet-context.jsonld https://raw.githubusercontent.com/jeswr/solid-federation-vocab/main/docs/sectors/health/diet-context.jsonld +# 51/51 representation URLs answered 200. From 9a288359657fbf6daecdf522257b72612fc1c360 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 22:04:46 +0000 Subject: [PATCH 16/17] docs: record VOC-02 lane validation Co-Authored-By: GPT-6.1-Sol (Codex) --- STATUS.md | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 STATUS.md diff --git a/STATUS.md b/STATUS.md new file mode 100644 index 000000000..eb0d57990 --- /dev/null +++ b/STATUS.md @@ -0,0 +1,101 @@ + + +# sst-xex / VOC-02 lane report + +Branch: `lane/sst-xex`. Base: `6b46636d065fd49f4a07d86c92cacad8ef4bea96` +(`suite/integration`). Work completed on 2026-10-25 in this checkout only. + +## Commits + +- `384a8fc2` — `feat(vocab): generate legacy namespace alignments`: snapshot the + pre-change term inventory from the base revision, generate 774 mappings, exclude + the compatibility sidecar from the merged build, accept Codex provenance, and + record conservative interpretations in `QUESTIONS.md`. +- `28cbe3f1` — `feat(vocab): rebase ontologies to jeswr.org`: move the package's + active bases to `https://jeswr.org/ns/`, version all 34 suite-owned ontology + nodes at 2.0.0 with explanatory descriptions, regenerate `docs/`, and add + migration checks plus the portfolio URL verification script/output. +- Final `docs: record VOC-02 lane validation` commit — this report. + +The 17 main ontologies retain all 774 terms: 220 classes, 304 properties and +250 individuals. Their generated old-to-new OWL mappings are opt-in only; the +build and all 14 offline catalog closures exclude that sidecar. `fedcon:` keeps +its ontology identity, term IRIs and version; references to rebased siblings +follow the new bases. Existing `prof:Profile` version histories retain their +version numbers under the new base. No packages/apps were added, and no +dependencies or lockfile entries changed. + +## Validation + +All commands below ran from the repository root unless stated otherwise. + +| Command | Result | +| --- | --- | +| `pnpm install --offline --frozen-lockfile --ignore-scripts` | PASS, exit 0; lockfile unchanged, lifecycle scripts disabled. | +| `node packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs` | PASS, exit 0; 774 mappings from all 17 pre-change ontologies. Re-running with typed wrapper accessors reproduced the committed Turtle byte-for-byte. | +| `pnpm exec biome check packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs packages/solid-federation-vocab/scripts/test-rebase.mjs packages/solid-federation-vocab/scripts/verify-persistent-ids.mjs` | PASS, exit 0; all three new scripts. | +| `pnpm --filter @jeswr/solid-federation-vocab run gate` | PASS, exit 0; lint, build, typecheck, test/validate and ontology gate. HermiT consistency was explicitly skipped because Java/ROBOT is unavailable. | +| `node packages/solid-federation-vocab/scripts/verify-persistent-ids.mjs /tmp/sst-xex-persistent-ids.ts` | PASS, exit 0; all 17 entries, all 51 live representation URLs HTTP 200, all local artifact filenames present, legacy predecessor fields retained. | +| `pnpm run lint:root` | FAIL, exit 1; three existing suite UI contrast failures, detailed below. All earlier root lint/guard steps passed. | +| `TURBO_SCM_BASE=6b46636d065fd49f4a07d86c92cacad8ef4bea96 pnpm run gate` | FAIL, exit 1; stops at the same root contrast failures before the affected Turbo tasks. | +| `pnpm run gate:full` | FAIL, exit 1; unrelated `@jeswr/unstorage-solid` build cannot write `/home/runner/.npm/_cacache/tmp/` (EROFS). Turbo reports 3 successful / 27 started tasks before stopping. | +| `git diff --check` | PASS. | +| `grep -rl 'w3id.org/jeswr' packages/solid-federation-vocab` | PASS; only source/served `legacy-w3id-alignments.ttl` and a historical comment in its generator. | +| `roborev status` | Unavailable, exit 127: command not found. No automated review verdicts could be read. | + +The brief's explicit package sequence also passed in full (exit 0): + +```sh +pnpm --filter @jeswr/solid-federation-vocab run lint && pnpm --filter @jeswr/solid-federation-vocab run build && pnpm --filter @jeswr/solid-federation-vocab run typecheck && pnpm --filter @jeswr/solid-federation-vocab run test && pnpm --filter @jeswr/solid-federation-vocab run ontology +``` + +The ontology gate parsed all 56 sector Turtle files and checked term hygiene for +every core/sector and root governance vocabulary. The migration checks verify +mapping completeness, relation types and direction, major-version metadata, +absence of active legacy IRIs, served-sidecar equality, unchanged fedcon identity, +and offline resolution of all 14 catalog closures. Existing temporal JSON-LD +and positive/negative scheduling SHACL fixtures still pass after the rebase. +The package gate builds before validating generated contexts/artifacts. + +The three root contrast failures are in files unchanged from the lane base: + +| Theme | Foreground | Background | Actual ratio | Required | +| --- | --- | --- | --- | --- | +| light | `--warning-foreground` | `--warning` | 4.331 | 4.5 | +| light | `--border-strong` | `--background` | 1.786 | 3 | +| dark | `--border-strong` | `--background` | 2.095 | 3 | + +The checks/scripts and suite UI tokens have no diff from the base commit. They +were left outside this vocabulary lane's scope. Temporary execution logs are +`/tmp/sst-xex-{install,build,validate,ontology,package-gate,lint-root,gate,gate-full}.log`. + +## Portfolio evidence and handoff + +The portfolio checkout named in the brief was absent. Its public +`config/persistent-ids.ts` was read without modification through the GitHub +connector: blob `10324e948403513b10e70e3935c78cef70331d08` on `main`. +The unmodified contents were saved temporarily as `/tmp/sst-xex-persistent-ids.ts` +for the verification command. The script's committed output is +[`packages/solid-federation-vocab/verification/persistent-ids.tsv`](packages/solid-federation-vocab/verification/persistent-ids.tsv). +It contains the UTC timestamp, every checked URL and final URL, and all 51 HTTP +statuses. All existing registry slugs, representation filenames and legacy +`w3id` fields already satisfy the brief, so no registry change was needed. + +The 200 checks establish availability of the currently published endpoints; +they do not publish this lane's new ontology bytes. No push, PR, branch switch, +remote git fetch/merge, portfolio edit or deployment was performed. The draft-PR +acceptance step is handed to the integration lead because the lane rules +expressly prohibit opening PRs; production deployment still needs Jesse's go. + +## Remaining limits and questions + +- The repository-wide gates are not green for the unrelated reasons above. +- Authoritative HermiT consistency remains unverified on this host because + Java/ROBOT is unavailable; `ontology-gate.mjs` reported its normal explicit skip. +- Per-commit roborev review remains unavailable because the executable is absent. + Beads was not modified: this is a dedicated lane checkout with no `.beads/`, + and the tracker skill restricts tracker mutations to the repository root. +- No dependency was added, so `check:packages` was not applicable. +- Screenshots: none; this task changes vocabulary identifiers and generated docs. +- No unanswered question blocks the code. The three specification interpretations + and their conservative resolutions are recorded in [`QUESTIONS.md`](QUESTIONS.md). From 94eb738f3aa8b8aaa46afd65e5f54a7c526de04e Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Sun, 25 Oct 2026 22:25:04 +0000 Subject: [PATCH 17/17] chore: remove lane report files --- QUESTIONS.md | 23 ------------ STATUS.md | 101 --------------------------------------------------- 2 files changed, 124 deletions(-) delete mode 100644 QUESTIONS.md delete mode 100644 STATUS.md diff --git a/QUESTIONS.md b/QUESTIONS.md deleted file mode 100644 index d099c6375..000000000 --- a/QUESTIONS.md +++ /dev/null @@ -1,23 +0,0 @@ - - -# sst-xex interpretation record - -1. **Portfolio draft PR versus lane isolation** — VOC-02 acceptance asks for a - portfolio draft PR, while the lane rules forbid PRs and changes outside this - checkout. Options: modify portfolio/open a PR, or verify the existing registry - read-only and leave the PR/deploy to the lead. Take the latter: no registry - edits are needed if its existing representation URLs work; commit the check - script and results here. No production deployment is authorized. - -2. **Version scope** — VOC-02 says “every ontology” and explicitly lists the main - core/sector/task/fed/fedreg ontologies. Options: bump only those main documents, - or also bump suite-owned `owl:Ontology` sidecars and curated import modules. - Take the literal reading: all rebased suite-owned ontology nodes become 2.0.0 - with version IRIs and an explanatory description. Third-party ontology - identities and existing `prof:Profile` version histories are preserved. - -3. **“fedcon: untouched” versus references to moved namespaces** — DECISIONS V1 - preserves `https://jeswr.org/fedcon#`, while VOC-02 requires removing active - legacy bases from the whole package. Options: freeze all fedcon files, or - preserve its terms, ontology identity and version while updating its fedreg - references. Take the latter so composed contexts and shapes keep working. diff --git a/STATUS.md b/STATUS.md deleted file mode 100644 index eb0d57990..000000000 --- a/STATUS.md +++ /dev/null @@ -1,101 +0,0 @@ - - -# sst-xex / VOC-02 lane report - -Branch: `lane/sst-xex`. Base: `6b46636d065fd49f4a07d86c92cacad8ef4bea96` -(`suite/integration`). Work completed on 2026-10-25 in this checkout only. - -## Commits - -- `384a8fc2` — `feat(vocab): generate legacy namespace alignments`: snapshot the - pre-change term inventory from the base revision, generate 774 mappings, exclude - the compatibility sidecar from the merged build, accept Codex provenance, and - record conservative interpretations in `QUESTIONS.md`. -- `28cbe3f1` — `feat(vocab): rebase ontologies to jeswr.org`: move the package's - active bases to `https://jeswr.org/ns/`, version all 34 suite-owned ontology - nodes at 2.0.0 with explanatory descriptions, regenerate `docs/`, and add - migration checks plus the portfolio URL verification script/output. -- Final `docs: record VOC-02 lane validation` commit — this report. - -The 17 main ontologies retain all 774 terms: 220 classes, 304 properties and -250 individuals. Their generated old-to-new OWL mappings are opt-in only; the -build and all 14 offline catalog closures exclude that sidecar. `fedcon:` keeps -its ontology identity, term IRIs and version; references to rebased siblings -follow the new bases. Existing `prof:Profile` version histories retain their -version numbers under the new base. No packages/apps were added, and no -dependencies or lockfile entries changed. - -## Validation - -All commands below ran from the repository root unless stated otherwise. - -| Command | Result | -| --- | --- | -| `pnpm install --offline --frozen-lockfile --ignore-scripts` | PASS, exit 0; lockfile unchanged, lifecycle scripts disabled. | -| `node packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs` | PASS, exit 0; 774 mappings from all 17 pre-change ontologies. Re-running with typed wrapper accessors reproduced the committed Turtle byte-for-byte. | -| `pnpm exec biome check packages/solid-federation-vocab/scripts/legacy-w3id-alignments.mjs packages/solid-federation-vocab/scripts/test-rebase.mjs packages/solid-federation-vocab/scripts/verify-persistent-ids.mjs` | PASS, exit 0; all three new scripts. | -| `pnpm --filter @jeswr/solid-federation-vocab run gate` | PASS, exit 0; lint, build, typecheck, test/validate and ontology gate. HermiT consistency was explicitly skipped because Java/ROBOT is unavailable. | -| `node packages/solid-federation-vocab/scripts/verify-persistent-ids.mjs /tmp/sst-xex-persistent-ids.ts` | PASS, exit 0; all 17 entries, all 51 live representation URLs HTTP 200, all local artifact filenames present, legacy predecessor fields retained. | -| `pnpm run lint:root` | FAIL, exit 1; three existing suite UI contrast failures, detailed below. All earlier root lint/guard steps passed. | -| `TURBO_SCM_BASE=6b46636d065fd49f4a07d86c92cacad8ef4bea96 pnpm run gate` | FAIL, exit 1; stops at the same root contrast failures before the affected Turbo tasks. | -| `pnpm run gate:full` | FAIL, exit 1; unrelated `@jeswr/unstorage-solid` build cannot write `/home/runner/.npm/_cacache/tmp/` (EROFS). Turbo reports 3 successful / 27 started tasks before stopping. | -| `git diff --check` | PASS. | -| `grep -rl 'w3id.org/jeswr' packages/solid-federation-vocab` | PASS; only source/served `legacy-w3id-alignments.ttl` and a historical comment in its generator. | -| `roborev status` | Unavailable, exit 127: command not found. No automated review verdicts could be read. | - -The brief's explicit package sequence also passed in full (exit 0): - -```sh -pnpm --filter @jeswr/solid-federation-vocab run lint && pnpm --filter @jeswr/solid-federation-vocab run build && pnpm --filter @jeswr/solid-federation-vocab run typecheck && pnpm --filter @jeswr/solid-federation-vocab run test && pnpm --filter @jeswr/solid-federation-vocab run ontology -``` - -The ontology gate parsed all 56 sector Turtle files and checked term hygiene for -every core/sector and root governance vocabulary. The migration checks verify -mapping completeness, relation types and direction, major-version metadata, -absence of active legacy IRIs, served-sidecar equality, unchanged fedcon identity, -and offline resolution of all 14 catalog closures. Existing temporal JSON-LD -and positive/negative scheduling SHACL fixtures still pass after the rebase. -The package gate builds before validating generated contexts/artifacts. - -The three root contrast failures are in files unchanged from the lane base: - -| Theme | Foreground | Background | Actual ratio | Required | -| --- | --- | --- | --- | --- | -| light | `--warning-foreground` | `--warning` | 4.331 | 4.5 | -| light | `--border-strong` | `--background` | 1.786 | 3 | -| dark | `--border-strong` | `--background` | 2.095 | 3 | - -The checks/scripts and suite UI tokens have no diff from the base commit. They -were left outside this vocabulary lane's scope. Temporary execution logs are -`/tmp/sst-xex-{install,build,validate,ontology,package-gate,lint-root,gate,gate-full}.log`. - -## Portfolio evidence and handoff - -The portfolio checkout named in the brief was absent. Its public -`config/persistent-ids.ts` was read without modification through the GitHub -connector: blob `10324e948403513b10e70e3935c78cef70331d08` on `main`. -The unmodified contents were saved temporarily as `/tmp/sst-xex-persistent-ids.ts` -for the verification command. The script's committed output is -[`packages/solid-federation-vocab/verification/persistent-ids.tsv`](packages/solid-federation-vocab/verification/persistent-ids.tsv). -It contains the UTC timestamp, every checked URL and final URL, and all 51 HTTP -statuses. All existing registry slugs, representation filenames and legacy -`w3id` fields already satisfy the brief, so no registry change was needed. - -The 200 checks establish availability of the currently published endpoints; -they do not publish this lane's new ontology bytes. No push, PR, branch switch, -remote git fetch/merge, portfolio edit or deployment was performed. The draft-PR -acceptance step is handed to the integration lead because the lane rules -expressly prohibit opening PRs; production deployment still needs Jesse's go. - -## Remaining limits and questions - -- The repository-wide gates are not green for the unrelated reasons above. -- Authoritative HermiT consistency remains unverified on this host because - Java/ROBOT is unavailable; `ontology-gate.mjs` reported its normal explicit skip. -- Per-commit roborev review remains unavailable because the executable is absent. - Beads was not modified: this is a dedicated lane checkout with no `.beads/`, - and the tracker skill restricts tracker mutations to the repository root. -- No dependency was added, so `check:packages` was not applicable. -- Screenshots: none; this task changes vocabulary identifiers and generated docs. -- No unanswered question blocks the code. The three specification interpretations - and their conservative resolutions are recorded in [`QUESTIONS.md`](QUESTIONS.md).