All notable changes to the SSTIM ontology — the versioned, citable artifact at
https://w3id.org/sstim — are recorded here. The format follows
Keep a Changelog and the project adheres to
Semantic Versioning. Release tags are vX.Y.Z; each tagged
version is frozen byte-identical under static/ontology/X.Y.Z/.
Scope. This tracks the reusable ontology term-space — every module listed in
static/ontology/manifest.json, which is the
authoritative bill of materials, together with the profile entry points that
name their closures.
BSC Lab application and infrastructure work is tracked in ROADMAP.md
and TODO.md. The rationale for each change lives in the
ADRs and the skos:historyNotes on the ontology nodes; this
file is the human-readable summary.
-
Ten prose totals still said 545 concepts after ADR 0025's six terms took the vocabulary to 551 — in the release changelog, the public README's call for translators,
CURRENT_STATE.md,IMPROVEMENT_PLAN.md,TODO.md, the OLS4 notes, and an unsent ShowVoc enquiry that would have quoted a stale figure to a registry. The count is generated intoTERM_INDEX.mdand CI-checked there, so the number was never in doubt; nothing compared the prose to it.truth-auditnow does, matching only present-tense totals — "all N", "of the N" — so a historical measurement like "269 of 545 carried all four" stays true and unflagged. -
The registry bundle asserted sixteen titles, sixteen descriptions and six creation dates about one ontology.
robot mergeunions every module header onto a single ontology node, so a registry got the whole module set's metadata as claims about SSTIM itself and picked from it arbitrarily. BioPortal chose August 1, 2026 as the creation date — the day ADR 0043's split created eight module files — over the 2026-04-12 the Kernel states and Zenodo,CITATION.cffand the registry tracker all use, and rendered the description as every module blurb joined by commas.make bioportal-bundlenow collapses those three to the Kernel's own values, the Kernel being the file that carrieshttps://w3id.org/sstimitself. Its set, not a single value: the title is legitimately four, one per published language — what it is not is sixteen.dct:requires,rdfs:seeAlso,dct:hasPartandskos:historyNotestay many-valued, because they are. Verified the result still loads under the OWL API and is still OWL 2 DL. -
The registry pull URL served the development line, so BioPortal had been ingesting
-devsnapshots nightly.https://labiosyncare.github.io/ontology/sstim-full.owlis BioPortal's and OLS4's "load from URL" target, and CI regenerates it on every push tomain— built, until now, from the working sources. BioPortal's submission history is the result: 0.15.0-dev, 0.16.0-dev, 0.17.0-dev, each parsed and indexed, its "Version information" naming a mutable line nobody can cite, and its Version IRI stuck at 0.14.0 because a-devbundle correctly carries none and the portal kept the last one it had seen.A stable URL a registry polls is a promise about the current release.
make bioportal-bundlenow reads the released version fromvoid.ttland builds from that version's frozen directory, so the artifact changes only when a release is cut, always carries itsowl:versionIRI, and fails outright if a-devline ever reaches it.
0.16.0 - 2026-08-18
-
SSTIM is in the OWL 2 DL profile (ADR 0054). Every profile closure was OWL Full: 5935 violations, from 57 external terms — SKOS, Dublin Core, PROV, ORG, VOAF, VoID, VANN, FOAF, BIBO, MOD, Creative Commons and the OBO uppers — used without the declaration axiom OWL 2 DL requires.
skos:prefLabelalone accounted for 1443. All 57 are now declared insstim-core.ttl, the one module present in every closure. They state the role each term was already used in and change no entailment. -
make validate-profileasserts all four closures against OWL 2 DL directly, and is part ofmake validate.make reasoncould not have caught this and never will: ROBOT loads non-strictly, so an undeclared annotation property is silently coerced into one and HermiT is handed a well-formed DL ontology. -
sstim-ex:limitAveragingTimeSeconds, anxsd:decimalcount of seconds, replacing a duration literal. -
Every
skos:ConceptSchemenow carriesdct:license(CC BY 4.0) — 67 of them, across the vocabulary, exposure and ecosystem modules. A scheme extracted on its own previously travelled with no licence at all. -
make language-coveragemeasures multilingual coverage per scheme and refuses to let it drift. A scheme must be complete or wholly untranslated, a new scheme must ship translated or be recorded as debt, and a translated scheme must leave the ledger. Closes the metric KR-16 lacked. It also reports — without gating —skos:altLabelcoverage, which is 15 aliases on 8 of the 551 concepts. Four documents had called that coverage zero; the aliases had been in the graph since ADR 0049 landed on 2026-08-15, and nothing measured them, so the claim went unchallenged. -
The SKOS vocabulary is fully multilingual. All 551 concepts now carry English, Italian, Portuguese and Spanish
skos:prefLabelvalues, across all 67 concept schemes. The gate found 269 of 545 complete; the remaining 276 labels were added the same day, somake language-coveragereports 100% and its ledger of untranslated schemes is empty.Two honest qualifications travel with this. The 276 new labels were written by the maintainers and have had no native review — a review request is open, and several known soft spots are named in it rather than left to be found. And
skos:definitionremains English-only for all 551 concepts: translating definitions is a substantially larger job and a separate decision, not an oversight. -
make definition-coveragegained a bar against definitions that restate their label, implementing the second-pass review's finding that a length check cannot catch them. -
make registry-verifymeasures what the public registries actually serve, deriving the expected namespace fromsstim-core.ttlrather than restating it. Network, opt-in, and deliberately outsidemake validate; it reports three states, because an unreachable registry is INCOMPLETE and never absence.It exists because it immediately found the worst defect in the tracker: prefix.cc served
sstim→https://w3id.org/sstim/— a slash where the ontology has a hash — whileREGISTRY_SUBMISSIONS.mdasserted the hash form and marked the entry DONE. Anything resolving the prefix built every term IRI wrong, andhttps://w3id.org/sstim/Presetis a 404. Nobody had fetched it, partly because prefix.cc's TLS certificate expired 2025-12-31 and an ordinaryhttps://check dies before it can answer.Corrected the same day — all four serialisations now serve the hash form, confirmed by re-running the gate. The slash form is still listed but outranked, which is why the check compares what is served rather than what exists.
-
Four translation defects, found by gating a property rather than by review. A translation must not collapse a distinction English makes, and three did: "Session interrupted" and "Stopped the session" shared a label in Italian and Portuguese, and "Relatedness unknown" and "Unknown relationship" shared one in Portuguese and Spanish. In every case a sibling language already distinguished them. A fourth, flagged in the 2026-08-18 translation pass and left open:
actionDeclinedread "Ação recusada" — the action was refused — for a concept defined as the participant choosing not to say what they did.The 276 labels written that day still have had no native review. This gate is not a substitute for one; it catches a class of error that does not need a native speaker to see.
-
The HED bundles' sidecars were not BIDS-conformant, and now are. They had been called "BIDS-style" without ever being handed to a BIDS tool. Measured 2026-08-18 with
bids-validator1.15.0: the first run returnedINTERNAL ERROR. SOME VALIDATION STEPS MAY NOT HAVE OCCURRED, which is no validation rather than a failed one. The cause was ours — a sidecar entry namedHEDholding aDescriptionand aDefinitionsarray, where BIDS reservesHEDfor a column's annotations and hands the entry's values to the HED parser. Definitions moved to their ownsstim_hed_definitionsentry, and all three bundles now validate with zero errors. The one remaining warning,CUSTOM_COLUMN_WITHOUT_DESCRIPTIONfor theHEDcolumn, cannot be fixed without reintroducing the crash and is raised with the HED Working Group. -
A session event can say what changed and to what —
sstim-v:eventParameterChanged(an eleventh session event type),sstim:StimulationParameterKindwithsstim-v:StimulationParameterKindScheme(level, carrier frequency, modulation frequency, duty cycle, phase offset), andsstim:hasChangedParameter,sstim:parameterValueBefore,sstim:parameterValueAfter. Until now asstim:SessionEventcould carry exactly two things, its type and its clock offset, so a stepped stimulus was unrecordable and a safety clamp could not say which value it clamped.The parameter kinds are modality-neutral quantities rather than field names, so they hold for an auditory, visual or haptic channel alike and SSTIM does not inherit one application's parameter list. SHACL requires a parameter-changed event to carry both the kind and the new value, and forbids those properties on events that change nothing; both constraints were checked against violations. All four profile closures remain in OWL 2 DL.
-
Two
lossyBecausestatements in the HED crosswalk were false.eventSafetyLimitAppliedtold consumers the requested and delivered values "must be read from the session record" when the session record could not hold them;eventEngineFallbackcalled the engine pair "SSTIM-only" when SSTIM has no engine-identity term at all. Both erred toward "our model is richer than the profile", which is the direction nothing audited. The first is now true; the second is withdrawn rather than reworded. -
Crosswalk 0.3.0 adds
detailTemplate, so HED carries per-event values it was always able to express: a safety clamp emits(Experiment-control, Constrained, Parameter-label/Level, Parameter-value/0.3)rather than a bare(Experiment-control, Constrained).hedremains the part the event type alone determines, andmake hed-roundtripstrips detail tags before reversing. -
Crosswalk 0.4.0 moves the parameter-kind labels into the contract. They had been a
PARAM_LABELSdict insidegenerate-hed-bundle.py— the wrong place twice over: they are part of the SSTIM-to-HED mapping, not of one generator, and nothing checked they still coveredsstim-v:StimulationParameterKindScheme. A sixth kind would have produced annotations with noParameter-labeluntil some fixture happened to use it, which is the same silent-undercoverage holemake hed-crosswalkhas always closed for event types — rebuilt one level down, hours after describing it. The gate now checks both schemes, in both directions, and validates each event template filled with every real kind rather than one invented sample. -
A third demonstrator bundle,
test/fixtures/hed-bundle-segmented/, covering the "explicitly segmented" stimulus of decision 5 with piecewise events. There is now one bundle per shape the decision names — fixed, segmented, continuous — and each manifest declares its ownmodulation.shape. -
The time-varying half of ADR 0025 decision 5 is built and enforced. A second demonstrator bundle,
test/fixtures/hed-bundle-modulated/, carries a Martigli breathing period gliding 4 s → 10 s over 300 s as a linked BIDS-style trace (stimulus.tsv+stimulus.json) rather than flattening it into the events table, which decision 5 forbids. The trace advances on delivered time, so the pause at 190 s freezes the arc and displaces the rest of the sweep; samples inside the pause aren/arather than interpolated, because nothing was being delivered there.The requirement had been stated since July with no instrument able to tell whether it held.
make hed-bundlenow refuses to write a bundle whose source declares a sweep without a trace, andmake hed-bundle-checkfails if a committed bundle flattened one.Piecewise events were the other representation decision 5 allows and were not available: SSTIM has no parameter-change event type. HED can carry that form —
(Definition/Sstim-breath-period/#, (Time-interval/# s))validates against 8.4.0 — so the gap is SSTIM's, and it is recorded as an ontology decision to take rather than made in passing. -
Cross-artifact identifiers, which decision 6 requires and the bundles lacked.
events.tsvcarries anevent_idcolumn and each manifest acrossArtifactIdsmap;make hed-bundle-checkresolves every one against asstim:SessionEventin the source graph. A file hash proves the bytes did not change, not that the identifiers mean anything. The manifests also carry the SSTIM suite and application versions, which decision 6 lists, and both sources are now validated against the Full-profile SHACL shapes — for the modulated source, this gate is the only place that happens. -
make hed-crosswalkgained a fourth check: the prose that restates its counts must still match them. Crosswalk 0.2.0 defined the two temporal scopes andeventPlaybackResumestopped being lossy, taking the count from six to five — the gate printed five the same day while the ADR and the generator's docstring went on saying six. A pattern matching nothing fails too, so rewording the prose cannot silently retire the check. Its reported tag count is also derived fromhedtoolsnow rather than a regex, which had countedDefand the two definition names as tags and missed the six tags inside the definitions.
-
sstim-ex:limitAveragingTimeis deprecated in favour ofsstim-ex:limitAveragingTimeSeconds, withowl:deprecatedanddct:isReplacedBy, and its range axiom withdrawn. Both public values were"PT8H"and are now28800.xsd:durationhad to leave rather than be declared: declaring it changes the violation from "undeclared datatype" to "defined datatype in datatype restriction", because OWL 2 DL rejects a defined datatype in that position however it arrives. It is only partially ordered —P1MandP30Ddo not compare — which is why OWL 2 excludes it.xsd:datewent the other way and is declared, becausexsd:dateTimewould mean inventing a time of day that is not known.This breaks a consumer pinned to the 0.12 baseline. Four published triples are gone; they are recorded in
check-sstim-full-equivalence.py's exception list rather than the gate being loosened. The deprecation triples point at the replacement, so the migration is discoverable from the graph. -
sstim-ex:limitAveragingTimedeprecation (already recorded above) is joined by two smaller corrections.sstim:durationSecondsnow says it is whole seconds and why: it is an intended duration, chosen by a person or shipped as a preset default, and intent is not authored at sub-second precision, while what actually happened stays decimal insstim:deliveredDurationSeconds. The second-pass review found two integer durations among nine decimals with nothing recording whether the coarseness was meaningful; the sibling was answered on 2026-08-17 and this one was missed. -
Each axiom is now asserted exactly once.
sstim-alignments.ttlrestated five upper-ontologyrdfs:subClassOfaxioms thatsstim-common,-technique,-sessionand-evidencealready carried, so every Full serialization held 10575 raw triples against 10570 distinct — the reason DBpedia Archivo counts five more than rdflib. The axiom belongs to the module that defines the class, which reaches profiles alignments does not:sstim-commonis in Core Plus while alignments is Full-only. The rationale prose stays in place as comments, following the convention the file already used forsstim:SessionInstance → prov:Activity.Consequently
sstim-alignments.ttlno longer referencescommon,sessionortechnique, and itsdct:requires— and its manifest entry — narrow toevidenceandvocab. Both had over-declared. -
Immutable snapshot routes are patterns, not an enumeration (ADR 0053). Four rules now cover every version, including releases not yet cut, replacing 30 enumerated ones — so a release no longer needs a pull request against
perma-id/w3id.org. The w3id maintainer asked for this while merging the 0.14.0 routes. One rule stays an enumeration and cannot grow: the pre-modular snapshots0.1.0–0.12.0, whose version IRI resolves tosstim-core.ttlbecause that file was the whole ontology before ADR 0043 split it.No published identifier changed meaning: every frozen artifact resolves to the same URL as before, checked by executing the committed rules against every file in every snapshot. What is given up is fail-closed routing — a version-shaped path that was never released now redirects to a Pages URL that answers 404, rather than 404ing at w3id.
-
The public preset and reference identity routes are live at last. They had been prepared but never submitted, so
https://w3id.org/sstim/ref/{id}and the twoimplementation/bsclab/preset/{id}IRIs answered 404 despite being published identifiers.
0.15.0 - 2026-08-17
-
Neural oscillations as their own terms (ADR 0049, closes KR-08):
sstim:NeuralOscillationTypeand six named rhythms, each carrying its conventional ambit viasstim:hasTypicalFrequencyBand, the wider range it actually occupies (sstim:extendedHzMin/Max), the topography that identifies it alongside frequency, and the state it is observed in. Rhythm, wave and oscillation are recorded as near-synonyms with their divergences named, rather than as bare alternate labels. -
Four neural-oscillation references, every DOI resolved through Crossref before being written.
-
make band-scope-notes— fails if a frequency band claims an outcome, or if an association ADR 0049 moved off the band scope notes stopped being recorded. -
make shacl-public-claim-gate— 16 adversarial fixtures across the 10 clauses of the public-claim contract, plus 2 positive controls. The gate never fires on committed data (nothing claims above C1), so without adversarial fixtures a deleted clause would be invisible to every other check. The harness is itself mutation-tested: removing the direction clause fails exactly two cases. -
SSTIM's own preset contract (ADR 0051, closes KR-07):
static/schemas/preset.schema.json, model tagsstim-preset-1. A preset is composed of modality-declaring components, not audio voices, so a visual or haptic component needs no new structure — and projects to RDF today through the genericsstim:composedOfTrack, which already ranges oversstim:Track. There is no component ceiling: the six-layer limit is the BSC catalog profile's engine constraint, and belongs on that profile's shape. Parameters carry their units in their names; one optionalbreathReferencereplaces a header flag and a per-voice flag that had to agree; there is no application product envelope. It takes the numeric parameter ranges from the BioSynCare catalog format documented inPRESET_FORMAT.mdand nothing else — that format is one audio-only application's incremental history, and a standard does not ratify one vendor's catalog taxonomy. -
make preset-contract— the parameter matrix, executed rather than tabulated. It reads every bound out of the schema, the SHACL shapes and the format document and compares them (12 parameters against SHACL, 11 against the documented ranges), so a bound changed in one place fails until the others follow. It also carries the cross-field rules no JSON Schema can express — beat frequency, pulse rate, breath-reference resolution, unique component ids, the level rationale — with 25 adversarial cases and 8 positive controls. -
One signal, several sensory renderings (ADR 0052):
sstim:StimulationSignalis a time-varying function with a frequency extent and a shape, and no modality.sstim:SignalRenderingbinds it to one channel's parameter by a named mechanism and states whether the result is physically present or perceptually constructed. Two channels naming one signal are two renderings of one design — asserted, where before a consumer had to infer it from two decimals that happened to match. 6 classes, 12 properties and 20 concepts across four schemes (sstim-v:SignalShapeScheme,RenderingMechanismScheme,RenderingPresenceScheme,RenderableParameterScheme). Signal shapes carry noise and sampled beside the four periodic forms, which is the waveform vocabulary Directions §1 wanted seen from the other side: one vocabulary for the shape a signal has and the waveform a rendering presents.Carrier and modulator are a rendering rather than the universal structure, so
sstim:renderingCarrierHzlives on the rendering. A carrier exists because 10 Hz falls below the audible range; a 10 Hz flicker or vibration is presented directly and has none. -
make signal-layer— four SHACL constraints that make the layer refuse abuse rather than merely describe it: an inverted extent, a sampled signal with no source, a binaural beat claimed as physically present, and a direct presentation carrying a carrier. 12 adversarial fixtures against 3 positive controls, one of them a genuine partial overlap (10–20 Hz straddling the alpha edge) so the constraints cannot pass by rejecting everything. -
The first real data in the signal layer. The sensory-field reference profile now states two ear channels at 200 and 204 Hz and a visual channel flickering at 3 Hz, and says two things it could not say before. The ear pair renders one signal: the 4 Hz beat is in neither ear's waveform, so both renderings name the same
StimulationSignaland both declare perceptual presence, checked againstsstim:impliesPresencerather than taken on trust. The visual channel renders a different signal — 3 Hz, not 4 — so this profile is not one signal delivered two ways, and now says so instead of leaving a reader to compare two decimals and guess, which is precisely the inference the signal layer exists to replace. Both signals also exercise the band-interval relations against real bounds: 4 Hz within theta, 3 Hz within delta. The layer had been exercised only by synthetic fixtures, which is what let three soundness faults sit in it for four days. -
Every published term now defines itself, enforced by
make definition-coverageover 1,004 terms: a definition may neither restate its label nor be too short to distinguish a sibling. All 17 frequency bands — the most-referenced vocabulary in SSTIM — carried a scope note and noskos:definition, and ADR 0049 rewrote every one of those scope notes six weeks earlier without noticing, because nothing checked. Each band's definition is generated from its ownhzMin/hzMaxrather than retyped, so the interval and the definition cannot disagree, and each says what the reviews kept having to repeat: a band is a conventional ambit and a Hz range, not the rhythm delimited by it. 26 definitions added, including three sensory modalities and the six noise colours; three existing ones — "Perceived taste.", "Perceived smell.", "Delivered across intact skin." — were rewritten rather than waived. -
The named-graph invariant has a test.
src/rdf/annotations/annotationRdf.jsemits eight quads and had no test file of any kind beside it, so dropping the graph argument from aquad()call would have passedmake test,make checkandmake validatewhile silently merging user annotations into the authoritative graph — the failure CLAUDE.md §5.5 and §8 exist to prevent. Six tests assert the property directly rather than through a snapshot, because a snapshot would be regenerated by whoever broke it; mutation-tested, removing one graph argument fails three of the six from three angles. They cover the neighbouring silent failure too: only an exact"public"reaches the shared graph (checked against ten plausible near-misses including"Public"," public"andtrue), two users land in two graphs, and no raw Firebase user id appears in any subject, object or graph name.
-
The public-claim gate now requires an applicability contract, not just a tier (ADR 0050, closes KR-04). It asked one question — does some claim linked by the deprecated
sstim:supportsRelationreach the required tier — so a rigorous study refuting a preset authorized the public claim it disproved. So did an assessment of a different subject, evidence from a modality the preset does not deliver, an unreviewed or withdrawn claim, and a claim citing literature no basis of it ever used. Authorization now requires one assessment satisfying all of: supporting direction, sufficient tier, the preset as both proposition subject and scope intervention, a declared population, a modality the preset actually delivers (derived throughfollowsProtocol→usesTechnique→techniqueModality), a public-safe citation that is also one of its own evidence bases, a confirming review decision with no contradicting decision against the same revision, and no deprecation or supersession.Consequence, and it is intended: no
sstim:EvidenceReviewDecisionexists anywhere in SSTIM, so no claim can currently authorize C3 or C5. No evidence review has been run, so the honest count of presets entitled to a public structure/function claim is zero. Nothing breaks today — both presets sit at C1. This hardens the existing C0–C5 ladder and neither adopts nor pre-empts the facet-based redesign proposed in ADRs 0028–0029. -
The five band-to-Wikidata mappings moved to the rhythms, where the items point: Q2469782 describes "a neural oscillation", not a Hz interval. Four became
skos:exactMatch. Beta stayedcloseMatch— Q831014 spans 12.5–30 Hz while SSTIM holds the sensorimotor rhythm apart at 12–15, so the item subsumes an entity SSTIM keeps separate. Each band carries askos:historyNotenaming where its mapping went. -
Outcome prose left the six primary band scope notes. Nothing was deleted: three associations became evidence assessments with a tier and a citation, seven became dated
noKnownEvidenceInSSTIMknowledge-status assertions. That a widely repeated association is unevidenced is itself recorded. -
AssessmentPropositionandEvidenceAssessmentClaimaccept aNeuralOscillationTypesubject. The evidence model assessed only what BSC delivers, and an assessment about an endogenous rhythm is neither a preset nor a technique. -
The frequency-band scheme description no longer calls these "neural oscillation frequency bands", and its editorial note records the resolution instead of deferring it.
-
The four preset validation gaps KR-07 named are closed in SHACL: a preset is capped at six voices; the binaural beat
|fl - fr|may not exceed 35 Hz unless it is exactly 40 Hz in a preset declaringgamma-40(a preset-level constraint, since the voice cannot see the target band); the Symmetry pulse ratennotes / dmay not exceed 50 Hz; and a voice louder than 0.30 must record why in anrdfs:comment— a rationale requirement rather than a hard ceiling, which is what the specification actually says. Two ranges the shapes had drifted from now match the specification: carriers are[80, 1000]Hz rather than anything above 0, and the Symmetry base note is >= 80 Hz rather than 50. No committed instance was affected. -
PRESET_FORMAT.mdstatediniVolumeas "0-1" in its per-type tables while its global limits section says 1.0 is invalid. It now reads0 <= v < 1. -
The public-claim gate could be switched off by omitting one triple. It opens with
?level requiresEvidenceTierRank ?req, and nothing made that property mandatory: a claim level without it matched nothing, so the whole constraint passed vacuously for every preset declaring that level. All six committed levels carry it, which is why correct data hid a fail-open contract.sstim-sh:PublicClaimLevelShapeandsstim-sh:EvidenceTierValueShapenow require the ranks the gate reads, with fixtures for both. -
The preset schema's modality claim was wider than its parameters.
breathing-oscillationandsymmetry-sequenceaccepted any modality while carrying audio-frequency parameters — the shipped fixture asserted a 180 Hz visual breathing guide and validated. All four defined kinds are now explicitly auditory. The structure stays modality-neutral; what is missing is the separation of an oscillation from the parameter it modulates, which is the same thing spatialization needs. -
The schema's
modalityenum listed nine values where SSTIM declares six.make preset-contractnow resolves all 45 controlled values across five schemes to declaredskos:notations and fails on invention (KR-17 pattern), and comparespermutationFunction's ceiling against the named permutations. -
Editorial notes on
sstim:ControlTrack,sstim:StimulusSpecificationandsstim-ex:StimulusChannelrecording the abstract-signal/rendering question on the terms themselves: thatControlTrack's modulation is prose no property expresses, that most of the rendering layer already exists on a channel (delivery medium and perceived modality held apart, plus carrier, flicker and beat rates) while the shared signal tying several channels to one target does not, and that SSTIM carries two modality vocabularies —sstim-ex:PerceivedModalitywith twelve concepts including proprioceptive, andsstim:SensoryModalitywith six, a strict subset. -
sstim-ex:hasFrequencyHzbecomes the generic parent of a frequency family rather than being deprecated:hasCarrierFrequencyHz(bears a signal the sense cannot receive directly),hasToneFrequencyHz(is itself the stimulus), andhasModulationFrequencyHz(the rate something varies at), whichhasFlickerRateHzandhasBeatFrequencyHznow specialise. It meant "carrier or tone frequency" — two things under one name. No migration: every existing assertion stays valid and now answers the generic question by entailment, which a deprecation would have broken.The parent drops
owl:FunctionalProperty, and had to: a channel presenting a 200 Hz carrier modulated at 10 Hz has two frequencies, and a functional parent would have entailed 200 = 10. Each child keeps functionality, which is where it belongs. -
sstim:hzMinandsstim:hzMaxaccept a signal as well as a band. The bound means the same thing on both — the edge of a frequency extent — and a signal needs one because noise spans a range rather than sitting at a point. A domain widening, so every existing band assertion is unaffected. -
make band-scope-notesalso checks frequency arithmetic: every oscillation's extended range must contain its typical ambit, and no band's interval may run backwards. -
Perceptual presence now follows from the rendering mechanism.
sstim:impliesPresencestates on eachRenderingMechanismwhat it necessarily produces — direct presentation, amplitude and frequency modulation and a monaural beat are physically present; a binaural beat is perceptually constructed, because the signal is absent from each ear's waveform. A rendering names its mechanism and the presence follows; SHACL rejects any rendering whose stated presence contradicts it. The rule it replaces named binaural-beat and physical explicitly, so it covered one mechanism of five: a monaural beat declared perceptual passed, and so did amplitude modulation. Reading the implied value from the mechanism covers all five and any added later, and cannot fall out of step with the vocabulary. This is the patternrequiresEvidenceTierRankalready uses on claim levels — the fact lives on the concept, and the gate reads it there. -
The two carrier properties stay, and must now agree.
sstim-ex:hasCarrierFrequencyHzdescribes emission and belongs to thehasFrequencyHzfamily, so a consumer can ask what a channel presents without knowing how it was specified;sstim:renderingCarrierHzdescribes a binding, and is the finer of the two since a channel may carry several renderings. They sit either side of the layer split ADR 0041 draws. Each now says this about the other in a scope note, and a SHACL constraint requires them to agree wherever both are asserted — which is what makes two names for one quantity defensible rather than merely tolerated. -
The band-interval relations are constrained. A signal spanning 4–8 Hz could claim
sstim:signalWithinBandalpha (8–13 Hz) and conform, though every ingredient for the check was present and ADR 0049 had added exactly this containment check for oscillations six weeks earlier. Three SHACL-SPARQL constraints compare the signal's extent against the band's, one per relation, including the overlap case that must reject both containment and disjointness. -
The
skos:notationuniqueness rule is stated and enforced. It holds within a category, not globally:eye-strainnames a comfort boundary, an effect and a reported experience, and those are three different things sharing a word. Checking properly showed zero collisions within a category across all 77 categories, so the 17 cross-category repeats follow the established pattern rather than breaking it. The rule matters becausepreset-contract.pyresolves 45 controlled values by (category, notation) exactly, and it had never been written down or checked. -
sstim:signalSourceAssethas therdfs:rangeit lacked (iao:0000030). A SHACL rule required a sampled signal to identify its source without saying what a source may be. -
sstim:citesReferencehas therdfs:domainit lacked, and a property shape, so the constraint the public-claim gate depends on lives in the model rather than only inside that gate's SPARQL. -
The two fixture gates share one pySHACL run. pySHACL costs ~7s over the 13,020-triple closure no matter how few fixture triples ride along, and
signal-layerran it 15 times whileshacl-public-claim-gateran it 20 — ~250 seconds spent re-validating an ontology that was identical and conformant on every pass, to check about 300 fixture triples. Each fixture is now rewritten into its own IRI namespace so subjects cannot collide, and is judged only on the results whose focus node is its own. That is strictly more precise than what it replaced: matching a message anywhere in a per-fixture report proved something failed with that text, where matching it on the fixture's own focus node proves this fixture failed for this reason.make signal-layer115s → 10.7s;make shacl-public-claim-gate149s → 11.7s.
0.14.0 - 2026-08-13
Published under version DOI 10.5281/zenodo.21923315, with
10.5281/zenodo.21286974 retained as the all-versions concept DOI.
The session-record release. SSTIM can now say what happened during a session, in what order, on which clock — and what a participant said about it, including what they were never asked. Closes audit findings KR-02 and KR-03.
- Session events and the clock that orders them
(ADR 0048):
sstim:SessionEventwith a ten-member type scheme,sstim:clockOriginSecondsandsstim:hasTimingAuthority, placed bysstim:sessionClockOffsetSeconds— which a during-session self-report also carries, since it is the same measurement against the same clock. Ordering lives in the offset, never in statement order. This is the term set the HED event profile needs — before it, SSTIM could not say that anything occurred during a session. - Delivered versus elapsed duration:
sstim:deliveredDurationSeconds, with a SHACL-SPARQL constraint holding delivered ≤ elapsed. A session paused for ten minutes and one that ran ten minutes shorter are no longer indistinguishable. - Reproducibility and integrity metadata:
sstim:hasReproducibilityLevelover identical-rendering / equivalent-signal / equivalent-presentation, plussstim:configurationDigestandsstim:digestAlgorithm, which SHACL-SPARQL requires together. - Qualified participant observations (closes KR-03):
sstim:ParticipantObservationwith a required six-value response state, so "none reported", "not asked" and "declined" stop collapsing into one silence;sstim:UnwantedExperienceObservationwith category, participant-reported severity, onset, persistence, action, resolution and participant-perceived relatedness;sstim:ObservationInstrumentwithsstim:instrumentVersion; scale bounds, anchor labels, prompt identity and reported confidence. Nine new controlled schemes, 57 concepts, all four languages. sstim-v:reportDuringSession— the fourth self-report phase. A during-session report previously had no phase and could not be represented at all.- A second Full competency question and its positive fixture, covering the
execution timeline: what happened, in what order, on which clock, and did it
run to completion? A term set with no executable demonstration is a claim
rather than a contract, and
make core-profile-contractnow runs this one against its own fixture.
sstim:SelfReport's definition andsstim-sh:SelfReportShape's message: a report is a collection event whose content is qualified observations, and the shape now accepts either those or the five legacy scalars. The scalars remain valid as documented simple projections, so no existing report became non-conformant.make full-equivalencenow asserts 0.12 compatibility rather than isomorphism: every baseline triple must survive, deliberate changes must be recorded as exceptions, and additions are counted rather than rejected. The old test conflated "identical" with "compatible", which held only while the ontology was forbidden to grow.- Re-audited the live Wikidata technique mappings: added a conservative
skos:closeMatchfromsstim-v:techMonauralBeatsto Q6898437 and weakenedsstim-v:techBinauralBeatsfromskos:exactMatchtoskos:relatedMatchbecause Q863539 also represents a perceptual phenomenon and music genre. - Corrected the VoID sidecar's modification date and its description of the
primary Turtle distribution. No released
0.13.0artifact was changed.
- The session projection rounded elapsed time to nearest, which could place
sstim:actualDurationSecondsbelowsstim:deliveredDurationSecondsand violate the delivered ≤ elapsed constraint on correct data. Elapsed is now rounded up. - A
suppliedstated goal whose free text was withheld projected as an observation carrying no value — an answer claiming the participant said nothing. It is now withheld whole. - The projection refuses to resolve a controlled value the vocabulary does not
declare, instead of minting
sstim-v:undefinedfrom an unguarded lookup. - Event wall clocks use
prov:startedAtTimerather thanprov:atTime, whose domain isprov:InstantaneousEventand notprov:Activity. make shacl-session-projectionvalidates the RDF the projection actually emits, with SHACL-SPARQL active — the blind spot the first two defects hid in, sincerdf-validate-shaclstripssh:sparqlandshacl-instancesonly covers committed files.- The recorder no longer invents a
playback-resumewhen a session is closed while paused. It settled the accounting by emitting an event that never happened, into a timeline whose purpose is recording what did. - The closing event is placed at the duration
close()records, rather than at a clock re-read a moment later, which left a timeline running past its own session. - The projection refuses a bundle whose records share an identifier. RDF has no duplicate subjects: two records sharing an id merge into one node holding both records' facts, which SHACL then reports as a cardinality violation pointing nowhere near the cause.
- A report's engine-clock offset is required for during-session reports and refused for the others, so a report collected before or after the session cannot carry a fabricated placement on a clock it never ran on.
0.13.0 - 2026-08-04
Published under version DOI 10.5281/zenodo.21792692, with
10.5281/zenodo.21286974 retained as the all-versions concept DOI.
The modular release. Everything below was previously listed as unreleased; the architecture is now frozen, citable, and served from the persistent namespace.
- The ontology is now a set of modules behind named profiles, not one root
file.
sstim-core.ttlwas a catch-all mixing stimulation, techniques, protocols, neuromodulation, evidence, configuration, sessions, caution metadata, and BSC voice terms. Its 385 declared terms are redistributed across 18 manifest-owned modules, each with one authoritative source, one ontology IRI, and a declared direct dependency set. No term was added, removed, or renamed — 385 declared terms before and after — and the Full union preserves 0.12.0 semantics at 9,977 normalized triples, verified bymake full-equivalence.sstim-core.ttlis now the dependency-free Kernel:sstim:Stimulationandsstim:SensoryStimulation, and nothing else. See ADR 0043 and the module architecture guide. sstim-ex:StimulusChannelkeeps its IRI but changes owner and definition. Its authoritative declaration moves from Exposure to Stimulus so the Core Profile does not depend on the optional Exposure concern, and its definition broadens from "a channel within an exposure profile" to cover a stimulus specification as well. Existing exposure channels retain their meaning; the public IRI is unchanged, andhttps://w3id.org/sstim/exposurenow serves a Stimulus + Exposure namespace catalogue so the IRI still dereferences to its declaration. See ADR 0044.sstim:hasStimulationTargetdeclares no domain in Core. ItsStimulusSpecification/SessionSpecificationunion domain moves intact to the Session module, so Core does not depend on Session. Session and Full restore exactly the 0.12.0 inference. The union stays one RDF list: severalrdfs:domainstatements would intersect rather than union.
- Four profile entry points — Kernel, Core, Core Plus, and Full — each a
W3C Profiles Vocabulary
prof:Profilewith an exact semantic closure, an explicitly associated SHACL closure, and a declared inference mode. A consumer can now implement a bounded contract instead of the whole graph. manifest.jsonandmanifest.schema.jsonas the authoritative bill of materials. The Makefile, loader, exporter, snapshotter, and release checks derive their inventories from it rather than repeating hand-maintained lists.- Distinct retrieval endpoints where a namespace IRI is not a single
module:
https://w3id.org/sstim/kernelfor the Kernel andhttps://w3id.org/sstim/module/exposurefor Exposure./sstimand/sstim/exposureserve generated namespace catalogues for hash-term dereference and are not import endpoints. - A reusable weak Core SHACL package (
sstim-core-shapes.ttl) alongside the retained Full aggregate, with a positive fixture and an executable contract proving Core accepts a determinate stimulus without Full delivery, placement, modality, or safety policy leaking into its validation. - Two Full property shapes,
sstim-sh:StimulusSpecificationChannelLinkShapeandsstim-sh:StimulusSpecificationTargetLinkShape, hardening the optional channel and target links under inference modenone(ADR 0044).
- The version IRI resolves to the whole release, not to one file.
make snapshotnow freezes a namespace catalogue beside the modules, becausesstim-core.ttlstopped being the whole ontology when it became the Kernel. The route generator refuses to emit a bare-version route for a modular snapshot that lacks one. - Every profile carries an executed conformance contract — a positive fixture and a SPARQL competency query, plus out-of-scope and adversarial fixtures wherever a SHACL closure exists to give those categories meaning (ADR 0045).
void.ttldescribes the release it names. The quality audit now derives its module set from the frozen manifest, so a catalogue is never counted as a module, and every frozen module must have a subset that distributes it.- New guards for divided
rdfs:domain/rdfs:rangeaxioms, unpublishable w3id redirect targets, and Turtle prose being parsed as an axiom.
- Release dates are now part of the release gate.
make snapshotrefuses a snapshot unless every module header declaresdct:issued=dct:modified= the release date (today, orRELEASE_DATE=YYYY-MM-DD), withdct:createdno later.dct:issuedhad never been bumped past the ontology's first issue date, so registries that read it as the version release date reported every version as released on 2026-04-12 — visible as BioPortal's Released column across all eight SSTIM submissions, corrected there by hand on 2026-07-27. Metadata and tooling only; no term changed. Seestatic/ontology/README.md.
0.12.0 - 2026-07-31
Published under version DOI 10.5281/zenodo.21717988, with
10.5281/zenodo.21286974 retained as the all-versions concept DOI.
Description-layer release (ADR 0041, ADR 0042).
- Added
sstim-stimulus.ttl, the eighth release module, withsstim:StimulusSpecification, the determinate/stochastic/adaptive regime, engine-independent channel quantities, and the optional stimulation-target axis. - Added session-level track disabling, master brightness, and scheduled-start properties pending the broader core/module extraction.
- Redefined
sstim:Presetas an engine-dependent configuration rather than the stimulation itself; stimulus specifications are the cross-engine comparison layer. - Retained generic
Trackand its four subtypes, assertedVoicebelowAudioTrack, and renamed Patch Studio's control concepts to LFO and Permutation in its persisted model.
- Withdrew the three-day-old
sstim:Patchclass before downstream adoption;Presetcovers the generic engine-configuration role.
0.11.0 - 2026-07-24
Published under version DOI 10.5281/zenodo.21536124, with
10.5281/zenodo.21286974 retained as the all-versions concept DOI.
Gate A (release integrity) + Gate B (semantic stabilization) of the
2026-07-24 RDF structure and publication audit.
Additive and backward-compatible: no term removed; the only narrowing
(sstim:SelfDirectedNeuromodulation, see below) had zero instance-level blast
radius. Targets 0.11.0 — bumped from a MINOR, not a patch, because Gate B
adds real new classes and properties on top of Gate A's metadata-only fixes.
- The frozen
0.8.0-0.10.0snapshots each self-cite thev0.7.0Zenodo DOI (10.5281/zenodo.21380171) and citation string instead of their own version DOI (RDF-01). Removed the staledct:hasVersion/dct:bibliographicCitationfromsstim-core.ttlandvoid.ttlpending this version's Zenodo DOI reservation (the0.5.0release shipped under the same no-version-DOI-at-freeze-time precedent). - Fixed the
v0.10.0history entry's leftover "under development" qualifier against its ownmod:status "released". - Synchronized every module's
owl:versionInfoand header# Version:/# Date:comments (six modules still said0.7.0). - Fixed
void.ttl's staledct:modifieddate andvoid:triples/void:classes/void:propertiescounts (updated again after Gate B's new terms). - Fixed the repository-root
README.md's stale ontology-graph counts (105/14/214/369/43 → 134/18/231/445/50) and protocol count (12 → 9). - Removed the
"@type": "@id"coercion ondcat:distributionincontext.jsonld(RDF-02): it silently dropped all 96 triples describingvoid.ttl's blank-node distributions when compacted with RDFLib.
Fixed (Gate B — semantic stabilization, ADR 0037)
sstim:SelfDirectedNeuromodulationcontradicted its own inherited genus (sstim:Stimulationrequires an applied input; the class's own definition included practices with none) (RDF-04). Addedsstim:DeliberateSelfRegulationas the neutral genus above no-applied-stimulus practices (unguided meditation, volitional breathwork); narrowedSelfDirectedNeuromodulationto stimulus-mediated cases only (neurofeedback, biofeedback, paced-breathing guidance).- The sensory branch of
sstim:Neurostimulationwas named in prose but never asserted in the class hierarchy, so neurostimulation-hierarchy queries silently excluded sensory examples (RDF-05). Addedsstim:SensoryNeurostimulation/sstim:SensoryNeurostimulationTechniqueas the intersection ofNeurostimulationandSensoryRouteNeuromodulation(not a blanket subclass axiom, so self-directed sensory-route cases like sonification biofeedback correctly stay excluded); retypedsstim-v:techGamma40Auditoryaccordingly. - Documented (not restructured) the decision to keep
sstim-v:techBiofeedbacka broad, neutral technique rather than split it into narrower neural/peripheral variants, since the neural-modulation objective is not equally definitional across its autonomic/muscular/electrodermal forms. - Three
sstim-exposure.ttlproperties (hasBodyPlacement,hasPerceptualGain,hasPerceptualLoss,hasExposureLimit) had an RDFS domain narrower than their own definitions documented; widened to accurate union domains (RDF-09). - Removed two duplicate scheme definitions (
StimulusTemporalStructureScheme,TechniqueScheme— the latter's second definition was stale and sensory-only) and fixed the stale Sensory Field SHACL test preamble comment that still described the export as non-conformant (RDF-15). - Completed the
EvidenceModalityScheme/EvidenceModalityTagdeprecation: the scheme and its nine concept values stayed active while the class and property were already deprecated (RDF-13); all now carryowl:deprecated trueand point to the replacement basis-axis properties. sstim:targetsFrequencyBand's "first entry is primary" claim doesn't hold — RDF property values are unordered (RDF-08, concrete sub-bug only). Addedsstim:primaryFrequencyBand, a functional sub-property, with a SHACL-SPARQL constraint requiring it to be one of the preset's owntargetsFrequencyBandvalues. The larger RDF-08 finding (oscillation-band vs. stimulus-target vs. outcome-hypothesis conflation) is deferred — seeFrequencyBandScheme'sskos:editorialNote.- Re-audited the five frequency-band-to-Wikidata
skos:exactMatchmappings (RDF-17): downgraded toskos:closeMatch, since each Wikidata item is the observed-EEG-oscillation sense while SSTIM's bands are also used, unsplit, as stimulus-frequency targets — extensional identity can't be claimed atexactMatch's confidence until RDF-08's split lands. - Added the missing
bfo:0000016("disposition") display-label stub, used bysstim:Neuroplasticity(RDF-17).
sstim:DeliberateSelfRegulation,sstim:SensoryNeurostimulation,sstim:SensoryNeurostimulationTechnique,sstim:primaryFrequencyBand.scripts/context-roundtrip-check.py+make context-roundtrip: round-trips every top-level and instance document through the publishedcontext.jsonld(not RDFLib's auto-generated one), wired intomake validate.scripts/verify-snapshot-checksums.mjs+make verify-snapshots: checksums every recordedstatic/ontology/<version>/snapshot againststatic/ontology/snapshot-checksums.jsonand fails on drift; every futuremake snapshotrecords its own checksums automatically. Wired intomake validate.- The GitHub Pages workflow now runs
make test(the full Vitest suite) before publishing, not onlymake validate(RDF-11): the runtime SHACL goldens and ecosystem-contract tests previously ran only in the independent lint workflow, so Pages could publish while one of them failed.
- An erratum still needs to be published against the already-archived
0.8.0-0.10.0Zenodo records noting their self-citation defect; that content cannot be corrected in place. - The whole-set version-manifest/checksums for a dereferenceable frozen closure (RDF-03, beyond the checksum ledger) and RDF-06/07/08 (full split)/10/14/16/18/19 are separate, larger gates and are not part of this pass.
0.10.0 - 2026-07-24
Published under version DOI 10.5281/zenodo.21528717, with
10.5281/zenodo.21286974 retained as the all-versions concept DOI.
Participant engagement and neurostimulation release
(ADR 0035,
ADR 0036),
from the 2026-07-22 Dr. Theo Marins (University of Graz) interview on
neuromodulation. Additive; no term removed or renamed. Frozen 0.3.0–0.9.0
snapshots are untouched.
- Participant-engagement-mode facet:
sstim:ParticipantEngagementModeclass,sstim:participantEngagementModeproperty, and a three-concept scheme (passive-receptive / guided-following / active-self-regulatory) — a sixth axis orthogonal to the five ADR 0034 facets. sstim:Neurostimulation(the stimulation-based branch of interventional neuromodulation) and the browsablesstim:NeurostimulationTechnique, with the seven energy techniques (rTMS, tDCS, tACS, DBS, VNS, ECT, focused-ultrasound) typed under it; the self-directed / interventional split (sstim:SelfDirectedNeuromodulation,sstim:InterventionalNeuromodulation); andsstim:Neuroplasticityas abfo:dispositionstub.sstim-v:techElectroconvulsiveTherapyin the non-sensory contrast set;sstim-v:techNeurofeedbackandsstim-v:techBiofeedbackas self-directed neuromodulation techniques.sstim-v:NeuromodulatoryEffectCollectionnaming the effect sense of neuromodulation over the outcome-phenomenon facet; invasive / minimally-invasive / non-invasive SKOS collections over the delivery-approach values.
sstim:Neuromodulationscope refined: pinned to the intervention sense (distinct from the physiological effect sense), excluding spontaneous physiological neurotransmitter-level modulation but admitting deliberate self-directed neuromodulation.skos:notes onsstim:Neuromodulationandsstim:Neurostimulationspell out the intervention-vs-effect and with-vs-without-participant-engagement axes.sstim-v:techNeurofeedbackandsstim-v:techBiofeedbackre-typed from the neutralsstim:StimulationTechniquelayer tosstim:NeuromodulationTechnique.
0.9.0 - 2026-07-22
Published under version DOI 10.5281/zenodo.21493918, with
10.5281/zenodo.21286974 retained as the all-versions concept DOI.
Stimulation and neuromodulation release (ADR 0034). SSTIM gains a neutral stimulation layer and formalizes how sensory stimulation relates to neuromodulation: the two overlap, and neither subsumes the other. Subsuming sensory stimulation under neuromodulation would assert neural modulation for every delivery instance, smuggling a mechanism claim into a class defined as delivery-only and bypassing the evidence layer.
Breaking on mutable latest, for consumers of the retyped focused-ultrasound
technique and the five deprecated response-as-mechanism IRIs. Frozen 0.3.0–
0.8.0 snapshots are untouched and retain their published entailments.
- Neutral
sstim:Stimulationumbrella andsstim:Neuromodulationsibling at the process, intervention, technique, and protocol layers, with the overlap named at each layer as a definedowl:intersectionOfclass requiring an intended canonical sensory-transduction route. - Five orthogonal facet axes — neural access route, delivery approach, neural target site, neural system, and neural phenomenon — as 56 new multilingual SKOS concepts across five schemes, plus 13 facet properties. Kept separate because a route, a dynamic, a system, and an outcome domain are not values on one scale; one value set is reused across intended, proposed-mechanism, and observed-outcome roles by distinct properties.
- Six non-sensory neuromodulation techniques — rTMS, tDCS, tACS, DBS, vagus nerve stimulation, and targeted intrathecal delivery — populating three distinct routes so the route axis is exercised rather than single-valued. None is referenced by any BSC preset, framework, protocol, or implementation; inclusion asserts neither BSC Lab capability, nor efficacy, nor safety.
sstim-ex:characteristicDeliveryMedium, a delivery-medium hierarchy including applied electric current, electric field, magnetic field, focused ultrasound, and chemical/pharmacological agents, and a stimulus channel-role facet that separates an intended causal channel from a concomitant one.- Six stimulus temporal structures for continuous, single-event, pulse-train, scheduled, bolus, and infusion timing.
- "Stimulation" and "Neuromodulation" graph perspectives, driven by a general
facet matcher in the navigator rather than by a
skos:Collectionminted in the vocabulary: a UI view is not a citable domain category.
techUltrasoundNeuromodis retyped ontosstim:NeuromodulationTechnique, off the sensory hierarchy, and defined by its intended focused neural target rather than by the categorical absence of an audible percept.techGamma40Auditoryis narrowed so gamma-oscillation modulation is definitional, then dual-typed into the sensory-route overlap. Broad techniques such astechPhoticDrivingdeliberately stay sensory-only: a use-level intention is not promoted into a universal property.TechniqueSchemeis relabelled "SSTIM Stimulation Technique Vocabulary". Its IRI was never sensory-scoped, so only the label had been narrower than its own identifier.- Shared domains and ranges widen to the neutral parents so a non-sensory
technique can be the subject of a conformant evidence assessment.
definedByFrameworkmoves to the general OBI protocol class so a capability-boundary or baseline protocol can be framework-authored without becoming stimulation. sstim-ex:ExploratoryProtocolno longer inherits a stimulation type. Seven exploratory protocols now declareSensoryStimulationProtocolexplicitly; three — a silence/darkness baseline, a mere-exposure field hypothesis, and a capability-boundary document — deliberately do not.make shacl-vocabvalidates the core+vocabulary+exposure closure, since technique identity is vocabulary-owned while characteristic media are exposure-owned and a cycle would otherwise be required.
- The SHACL escape hatch in which any
skos:editorialNotesuppressed a technique's mechanism, temporal-structure, and modality requirements. Free text must not control structural conformance. The five notes remain as annotations.TechniqueShapekeeps its published IRI, retargeted to the neutral technique class and composed with six disjointly-targeted shapes.
mechFFR,mechASSR,mechSSVEP,mechSSSEP, andmechStartledenoted evoked responses and a reflex, not causal mechanisms. Each keeps its IRI as a tombstone withdct:isReplacedByand is stripped of itsStimulationMechanism/skos:Concepttyping and scheme topology — deprecation alone would have preserved the false entailment. Seven replacement neural phenomenon concepts are minted.
0.8.0 - 2026-07-20
Framework-scope release. sstim:definesTechnique on the BSC framework is now
reserved for the three techniques BSC actually originated; four framework-scoped
duplicates of vendor-neutral vocabulary concepts are retired in favor of the
new sstim:incorporatesTechnique relation (ADR 0033). No previously released
term was removed from sstim-core.ttl, sstim-vocab.ttl, or sstim-shapes.ttl;
the retirements are confined to the framework/bsc/technique/ instance IRIs,
which never resolved through w3id in any prior release.
- Published SSTIM
v0.8.0under version DOI10.5281/zenodo.21462727, retaining10.5281/zenodo.21286974as the all-versions concept DOI. sstim:incorporatesTechnique(ADR 0033): links aSensoryStimulationFrameworkto a pre-existing, vendor-neutral technique it applies without redefining. Additive — does not narrow or replacesstim:definesTechnique.- w3id routes for all seven BSC framework technique IRIs (three originated, four
retired), each an exact rule rather than a prefix wildcard, audited fail-closed
by the quality-audit route checker. Previously no technique IRI under
framework/bsc/technique/resolved at all.
bsc-fw-tech:binaural-beat-stimulation,photic-rhythm-stimulation,audiovisual-rhythm-coordination, andvibrotactile-rhythm-stimulationare retired fromsstim:definesTechniqueon the BSC framework and re-expressed assstim:incorporatesTechniqueover their existing vocabulary counterparts (sstim-v:techBinauralBeats,techPhoticDriving,techAudiovisualEntrainment,techVibrotactileEntrainment) — each alreadyskos:relatedMatch-linked from the retired term, so no relation is newly asserted, only relocated onto the released IRI.bsc-reference-protocols.ttlfollows the same substitution.
0.7.0 - 2026-07-15
Evidence- and ecosystem-governance release. No public term IRI was removed, but legacy flattened evidence and ecosystem properties are deprecated and rejected for newly authored conforming data. Consumers should follow the ADR 0027 and ADR 0031 migration notes. All committed ecosystem agent records are synthetic; the mutable external store required for real live-only records remains a post-release F3 gate.
- Published SSTIM
v0.7.0under version DOI10.5281/zenodo.21380171, retaining10.5281/zenodo.21286974as the all-versions concept DOI. rdfs:seeAlsofrom the core ontology node to the generated WIDOCO reference documentation (https://labiosyncare.github.io/ontology/docs/), so harvesters that read ontology metadata (e.g. LOV) discover the documentation (ADR 0023).- Evidence-assessment contract (ADR 0027): immutable assessment revisions, atomic bounded propositions, explicit scope axes, qualified evidence bases, source/search governance, PROV assessment and review activities, conflict and independence records, and orthogonal controlled values for modality, study design/model, synthesis type, outcomes, and scope missingness.
sstim-ecosystemmodule (ADRs 0024 and 0031): neutral ecosystem agents, qualified agent-target relationships, ORG memberships, implementation responsibility, purpose-scoped engagement activities, and controlled relationship/purpose/outcome vocabularies.- Closed SHACL publication profiles for evidence and ecosystem records, including the separate reusable private-audit shape file, public/private predicate boundaries, lifecycle ordering, terminal deletion, and current-state projection rules.
- Synthetic ecosystem fixtures demonstrating one person with multiple memberships and implementation relationships without cross-association, together with an executable admission harness, JSON-LD round-trip checks, 46 adversarial SHACL fixtures, and 11 runtime loader/graph tests.
- Ecosystem named-graph, VoID, loader/context, quality-audit, Pages validation, and staged w3id plumbing. Real live-only records are expressly excluded from the Zenodo-tracked release repository.
- Deprecated the overloaded
EvidenceModalityTag, mutable review/status fields, directionally misleadingsupportsRelation, and other flattened evidence properties. A non-authoritative 0.7 compatibility export remains available; authorization and validation use only the new contract. - Migrated the public evidence fixtures and runtime exporter to qualified bases, explicit propositions/scopes, immutable provenance, identified agents, and review decisions. Universal evidence-absence claims are forbidden; scoped search findings require a reproducible search record.
- Replaced the initial flat ecosystem surface with qualified relationship, membership, implementation-responsibility, and engagement records. Public data is an approved retractable current-state projection; negative, disputed, amended, removed, and consent-evidence history belongs to an access-controlled external ledger.
- Made runtime Web Annotation serialization valid and private by default, and tightened JSON-LD coercion, namespace parity, per-artifact validation, release-version consistency, and snapshot refusal checks.
- Clarified that
make snapshotfreezes only the seven ontology modules while a GitHub–Zenodo release archives the complete repository state at its tag. Real mutable ecosystem records must therefore be served outside this release repository.
- Prevented public/private RDF leakage through nested or untyped auxiliary nodes, ambiguous parallel consent/relationship values, orphan terminal records, and mismatched public/private activity mirrors.
- Removed unqualified universal-absence language and separated source-observed results from SSTIM's assessment direction and public wording decisions.
0.6.0 - 2026-07-11
Semantic-quality and FAIR-metadata release. No SSTIM term IRI was removed or renamed, but corrected superclass axioms change some inferred types; consumers that depend on the pre-0.6 upper model should review ADR 0021. The release was accepted through maintainer-guided review and automated external validation; independent human ontology review is explicitly deferred by ADR 0022.
- Complete module-level ontology metadata for all six editable SSTIM modules, including titles, descriptions, creators, licenses, dependencies, development version identifiers, and change-history notes.
- Structured caution governance: an ordered severity vocabulary plus trigger condition, affected population, recommended action, and display priority for every public caution tag.
- Self-report phases and an explicitly synthetic reference session with pre-session and immediate post-session observations; no personal data is included.
- Two non-clinical BSC Lab reference protocols, three additional framework technique records, and protocol/safety/public-claim links for both public reference presets.
- Reviewed evidence records and public-safe references for paced breathing, SSVEP, SSSEP, and multisensory integration, with claim-level PROV attribution and review dates.
- Repository-wide RDF quality and competency checks
(
scripts/sstim-quality-audit.pyand the expandedscripts/sstim-exposure-sanity.mjs) covering metadata, SKOS integrity, functional-value collisions, evidence provenance, cautions, protocol/preset paths, sessions, loader coverage, dangling IRIs, and VoID counts. - Graph-isomorphic export verification for every generated JSON-LD and RDF/XML
module serialization, included in
make validateand CI. - SHACL contracts for module metadata, evidence provenance, protocols, implementations, caution severity, self-report phases, exposure profiles, unique SKOS notation, hierarchy inverses, and cycle prevention.
- VoID + DCAT dataset description (
static/ontology/void.ttl) for FAIR publication: onevoid:Datasetwith per-module subsets and Turtle/JSON-LD/ RDF-XML distributions, checked whole-set counts, a public-instance subset,void:uriSpace, vocabularies used, and example resources. Added avoid:inDatasetback-link on the ontology node so registries discover it. Staged the/sstim/voidw3id route. (PUBLICATION plan B3) - Staged JSON-LD / RDF-XML content-negotiation for core and every module in the
w3id
.htaccess(Accept: application/ld+json→.jsonld,application/rdf+xml→.rdf, else Turtle). Goes live via the nextmaindeploy plus a perma-id/w3id.org PR. (PUBLICATION plan B2) - Expanded
static/ontology/context.jsonldfor the post-0.5.0/P6 public surface: evidence and public-claim governance terms, Patch Studio voice/session parameters, exposure-module predicates, implementation-data prefixes, and VoID/DCAT metadata aliases. (PUBLICATION plan B4) - Added ROBOT/HermiT OWL DL consistency validation (
make reason) over the merged ontology term-space modules, wired intomake validateand the RDF CI workflow. (PUBLICATION plan B3) - Enabled GitHub↔Zenodo release archiving and published SSTIM
v0.5.0under version DOI10.5281/zenodo.21286975and all-versions concept DOI10.5281/zenodo.21286974. Added the DOI links to the ontology and VoID/DCAT metadata, citation guidance, and JSON-LD context. (PUBLICATION plan B5) - Published SSTIM
v0.6.0under version DOI10.5281/zenodo.21302910, retaining10.5281/zenodo.21286974as the all-versions concept DOI. - Reassessed the deployed canonical URI with FOOPS at 87.5%; all minimum metadata and version-IRI checks pass, leaving only registry-dependent checks.
- Added the 2026-07-10 external automated review disposition, covering OOPS, FOOPS, OLS/OBO identifier checks, and authoritative safety-source checks.
- Recorded the
0.6.0review posture in ADR 0022: maintainer acceptance is sufficient for this release, with independent human review deferred and no claim of independent sign-off.
- Finalized all six ontology modules as
0.6.0; the core identifies the immutable whole-set release ashttps://w3id.org/sstim/0.6.0, while the other modules carry synchronizedowl:versionInfounder ADR 0020. - Reclassified sensory modality, stimulation mechanism, and intended effect as information-content categories rather than biological processes, roles, or dispositions. Session specifications are PROV plans, session executions are PROV activities, and implementations are PROV entities. (ADR 0021)
- Added operational definitions to all previously undocumented public properties, concept schemes, and exposure concepts, including explicit measurement-dimension wording for exposure effects.
- Materialized SKOS
hasTopConcept/topConceptOfandbroader/narrowerinverse navigation throughout the live vocabulary. - Strengthened every evidence record with modality, direction, review status, review date, modification date, subject, and responsible-agent provenance; exploratory exposure claims are explicitly speculative, inconclusive, and provisional.
- Narrowed external alignment scope: whole-domain brainwave-entrainment and
therapy mappings were removed, the binaural voice relation was weakened to
skos:relatedMatch, and multisensory integration gained a verified related mapping. - Expanded the RDF loader and JSON-LD context to cover protocols, both public presets, synthetic sessions, safety terms, and PROV metadata.
- Restricted the OBI protocol alignment to
SensoryStimulationProtocol;SensoryStimulationTechniqueis now an IAO information-content category. - Clarified
derivedFromas an asymmetric, irreflexive immediate-predecessor relation rather than a symmetric or transitive preset relation. - Completed publisher/issued metadata for every module and added citation, DOI, status, source, and logo metadata to the core ontology.
- Removed the stale MeSH
D012910candidate mapping after authoritative NLM verification showed that the identifier denotes Snake Venoms, not sensory stimulation. - Removed an unverified Music Ontology association and corrected overly broad upper-ontology assertions on controlled-value classes.
- Included the previously omitted theta breathing preset in the runtime RDF loader.
- Replaced hand-maintained/omitted VoID metrics with counts checked by the repository quality audit.
- Fixed the ROBOT reasoning Make target so a missing executable or failed reasoner command exits nonzero instead of printing a false success message.
- Removed obsolete
OBI_0000011from live planned-process axioms; retained activeCOB_0000082for sensory stimulation interventions. - Added the missing
dct:Standardrange onconformsToStandard, updated the WCAG and NIOSH references, and attributed the 30 J/m2 ultraviolet limit to ICNIRP while retaining IEC 62471 for lamp risk classification. - Rewrote the core domain description and
SensoryStimulationdefinition so delivery, proposed mechanisms, observed responses, and outcomes are not conflated.
0.5.0 — 2026-07-09
Domain-content coverage (IMPROVEMENT_PLAN P5) and evidence-integrity governance (P7). Additive and backward-compatible — no terms removed or renamed. The exposure module is released at 0.4.1 within this whole-set snapshot.
- Visual, tactile, and cross-modal technique concepts (photic/flicker driving, audiovisual entrainment, colour-field stimulation, vibrotactile and audio-tactile entrainment) and the steady-state evoked-potential mechanism family — SSVEP, SSSEP, and multisensory integration. (ADR 0015)
- Reference-pitch retuning (432 Hz etc.) as a
NonEntrainmentTechnique, with carrier-pitch exposure properties and a carrier-vs-modulation evidence firewall. (ADR 0017) VIS,TACTILE, andMULTISENSORYevidence-modality tags (P5.6).sstim:PublicClaimLeveland the C0–C5 public-claim-level vocabulary, with a SHACL claim-legality constraint and a conditional-citation constraint (evidence tier ≥ 3 must cite aPublicSafeReference). (ADR 0018)owl:priorVersionlinks on the core and exposure ontology nodes.- First populated technique
EvidenceClaiminstances — ASSR and FFR as measurable responses, the mixed binaural-beat outcome, and the explicit chromotherapy / Solfeggio / 432 Hz negative assertions — plus two Crossref-audited references (PICTON_2003,SKOE_KRAUS_2010). (P5.4; instance data understatic/ontology/instances/, not part of the versioned term-space.)
- Modality nomenclature cleanup: narrowed the
modalitySomatosensorylabel to "Somatosensory", adopted the convention haptic = device / tactile = percept / somatosensory = superordinate channel / vibrotactile = mechanism, and completed theskos:closeMatchbridge between thesstim-v:sensory-channel andsstim-ex:perceived-modality vocabularies for all six shared channels. (ADR 0019) - Corrected the
EvidenceModalityTagdefinition string (it listed six values; the scheme has carried nine since the P5.6 additions). - Exposure module 0.4.0 → 0.4.1 (additive: the closeMatch bridge and convention scope notes).
- Module versioning (ADR 0020):
the whole-set snapshot (
static/ontology/<version>/, identified by coreowl:versionIRI) is the single citable unit. Removed the exposure module's independentowl:versionIRI/owl:priorVersion(they never dereferenced); modules now carryowl:versionInfoonly, as a module-level change counter.
The exposure & experiment module (sstim-exposure.ttl), separately versioned.
- Reusable exposure module separating physical delivery medium, perceived modality, device capability, body placement, comfort boundary, experiment context, effect claims, and knowledge status. (ADR 0010)
- Sensory Field quantitative stimulus properties (frequency, flicker rate, beat
frequency, duty cycle, gain, phase), left/right laterality body placements, and
the
ExposureLimitclass with optical/flicker/hearing safety boundaries citing external standards. (ADR 0011)
0.3.0 — 2026-06
sstim-v:TechniqueScheme— a vendor-neutral controlled vocabulary of auditory and cross-modal sensory-stimulation techniques — with seven newStimulationMechanismconcepts (ASSR, auditory-motor coupling, closed-loop phase reinforcement, masking, vibrotactile mechanoreception, acoustic startle, ultrasonic neuromodulation) and thesstim:techniqueModalityproperty. Two non-evidence-bearing folk techniques catalogued with explicit editorial notes.
0.2.0 — 2026-06
sstim:CautionTag,sstim:VoiceType, andsstim:PermutationFunctionclassification classes and thesstim:hasCautionTagproperty; theStimulusTemporalStructureconcept scheme; dual-typed caution, voice-type, permutation, and temporal-structure concepts; full it/pt/esprefLabelcoverage; and external upper-ontology label stubs.
- 0.2.0 erratum: corrected external alignment IRIs wrong since 0.1.0 — every
Wikidata QID (all resolved to unrelated entities), the
EvidenceClaimparent (iao:0000001→iao:0000030), the obsolete OBI planned-process parent (addedcob:0000082), a non-existent ORCID (→ the verified0000-0002-9699-629X), and a dead repository link. No vocabulary terms changed.
- Initial public release: OWL 2 DL class hierarchy, SKOS vocabulary, SHACL shapes, and external alignments. Vocabulary seeded from the BSC preset catalog v0.9.1. "Sensory Stimulation" adopted as the umbrella term over the coined "Sensory Harnessing".