- accepts_or_accepted_external_work: Remove verbose examples list
- accepts_or_accepted_payment_method: Condense to single sentence
- accepts_or_accepted_visiting_scholar: Minor rewording for consistency
- Add is_likely_wrong_person and wrong_person_reason fields to MatchCandidate
- Add confidence_original field for tracking pre-adjustment scores
- Add visual indicators: AlertTriangle for wrong person, Star for high confidence
- Add filter checkboxes: 'Show high confidence (>80%)' and 'Hide wrong person'
- Add wrong person alert banner with bilingual labels (NL/EN)
- Add danger stat card showing count of likely wrong person matches
- Style signal badges by type: danger (birth_year_mismatch), success (validated)
- Add extensive CSS for wrong-person/high-confidence alerts and candidate styling
When users click on a different class, enum, or slot in the sidebar,
the ontology term popup now automatically closes. This prevents the
popup from persisting and showing stale information from the
previously viewed schema element.
The slot details section was rendering close_mappings, narrow_mappings,
broad_mappings, and related_mappings twice each. This caused the mappings
to appear duplicated on pages like /linkml?class=AcademicArchive.
Removed 68 lines of duplicate JSX code.
- Fix resolveUri() to handle bare local names like 'E27_Site' used by CIDOC-CRM
(previously only handled URIs starting with '#')
- Add EDM (Europeana Data Model) ontology to frontend
- Copy edm.owl to frontend/public/ontology/
- Register in ONTOLOGY_FILES array
- Add 'edm' prefix to STANDARD_PREFIXES
- Add EDM color to ONTOLOGY_COLORS
- Render HTML content in ontology descriptions safely using DOMPurify
- Sanitize HTML to allow only safe tags (a, br, em, strong, etc.)
- Fix Schema.org relative links to absolute URLs
- Add target='_blank' to external links
- Updated `entity_review.py` to map email semantic fields from JSON.
- Expanded `email_semantics.py` with additional museum mappings.
- Introduced a new rule in `.opencode/rules/no-duplicate-ontology-mappings.md` to prevent duplicate ontology mappings.
- Added a backup JSON file for entity resolution candidates.
- Created `enrich_email_semantics.py` to enrich candidates with email semantic signals.
- Developed `merge_entity_reviews.py` to merge reviewed decisions from a backup into new candidates.
- Create .opencode/rules/no-duplicate-ontology-mappings.md with detection script
- Add Rule 52 to AGENTS.md (after Rule 51)
- Fix 29 duplicate mappings: same URI in multiple mapping categories
- 26 slot files: remove duplicates keeping most precise mapping
- 3 class files: ExhibitionSpace, Custodian, DigitalPlatform
- Mapping precedence: exact > close > narrow/broad > related
Each ontology URI must appear in only ONE mapping category per schema
element, following SKOS semantics where mapping properties are mutually
exclusive.
The VCard ontology file (and 3 others) use @base directive with relative URIs
like <#Address>. The Turtle parser was not extracting @base or resolving
relative URIs against it.
Changes:
- Extract @base directive in first pass alongside @prefix
- Add baseUri parameter to expandUri() function
- Handle relative URIs starting with # (resolve against base)
- Handle empty relative URI <> (returns base URI itself)
- Pass baseUri through to processSubject() function
This fixes the 'Term not found' error for vcard:Address and similar terms
that use relative URI notation in their ontology definitions.
Affected ontologies: vcard.rdf, prov.ttl, era_ontology.ttl, ebg-ontology.ttl
Removed conditional execution from Layer 2 and Layer 4.
All layers now run on every push, PR, and schedule.
Quality Gate requires all 4 layers to pass.
upload-artifact@v4 is not supported on GHES/Forgejo.
All 35 unit tests passed, but job failed due to artifact upload.
Downgrading to v3 which is compatible with self-hosted runners.
- Create venv at /opt/venv in each job
- Source venv/bin/activate before pip install and pytest commands
- Add python3-full package for complete venv support
- Fixes 'externally-managed-environment' error on Debian Bookworm
The Forgejo runner with label ubuntu-latest:docker://node:20-bookworm
does not properly support custom container overrides. Instead of using
container: image: python:3.11-slim, we now install Python from apt-get
in the node:20-bookworm base container (which is Debian-based).
Changes:
- Remove container: blocks from all 4 layer jobs
- Add 'Install Python' step to each job
- Use python3/python3 -m pip/python3 -m pytest commands
- Remove trigger comment from test file
- Introduced SoundArchiveRecordSetType, SpecialCollectionRecordSetType, SpecializedArchiveRecordSetType, SpecializedArchivesCzechiaRecordSetType, StateArchivesRecordSetType, StateArchivesSectionRecordSetType, StateDistrictArchiveRecordSetType, StateRegionalArchiveCzechiaRecordSetType, TelevisionArchiveRecordSetType, TradeUnionArchiveRecordSetType, UniversityArchiveRecordSetType, VereinsarchivRecordSetType, VerlagsarchivRecordSetType, VerwaltungsarchivRecordSetType, WebArchiveRecordSetType, and WomensArchivesRecordSetType.
- Each new type includes appropriate metadata, slots, and relationships to existing classes.
- Implemented a script to detect and fix Type class violations in LinkML files.
- Switch all jobs to use python:3.11-slim container
- Remove setup-python action (not cached on Forgejo runner)
- Add apt-get install for openssh-client and curl in SSH tunnel jobs
- Increased timeout for unit-tests to 10 minutes
- Remove unused PYTHON_VERSION env var
- Remove inline slot definitions from 144 class files
- Create 7 new centralized slot files in modules/slots/:
- custodian_type_broader.yaml
- custodian_type_narrower.yaml
- custodian_type_related.yaml
- definition.yaml
- finding_aid_access_restriction.yaml
- finding_aid_description.yaml
- finding_aid_temporal_coverage.yaml
- Add centralize_inline_slots.py automation script
- Update manifest with new timestamp
Rule 48: Class files must NOT define inline slots - all slots
must be imported from modules/slots/ directory.
Note: Pre-existing IdentifierFormat duplicate class definition
(in Standard.yaml and IdentifierFormat.yaml) not addressed in
this commit - requires separate schema refactor.
- Add entry count badge next to schema file name showing (xC, yE, zS) counts
- Add tooltip explaining LinkML file names vs class names
- Remove redundant section headers (Classes, Enums, Slots collapsible sections)
- Add URL params for enum (?enum=) and slot (?slot=) deep linking
- Persist category filters, dev tools visibility, and legend visibility to localStorage
- Set 'Main Schema' filter to OFF by default (confusing for users)
- Add Rule 48: Class files must not define inline slots
- Introduced EnvironmentalZoneTypeEnum.yaml to classify climate-controlled storage zones with detailed descriptions and recommended conditions for various materials.
- Created slots for environmental zone type code, description, ID, label, and HC preset URI to facilitate structured data representation.
- Implemented boolean slots for specific environmental requirements including dark storage, dust-free environment, ESD protection, and UV filtering, referencing relevant ISO standards.
- Enhanced documentation for each slot to clarify usage and preservation context.