Add Playwright test results JSON file with initial test suite and failure details

This commit is contained in:
kempersc 2026-01-09 21:33:31 +01:00
parent 004d342935
commit 519b0b47a8
43 changed files with 2620 additions and 839 deletions

View file

@ -0,0 +1,14 @@
# E2E Test Credentials (copy to .env.test and fill in)
#
# Production test account format:
# TEST_USER_EMAIL=yourname@nationaalarchief.nl
# TEST_USER_PASSWORD=your_password
#
# Run tests:
# source e2e/.env.test && pnpm test:e2e
#
# Or inline:
# TEST_USER_EMAIL=yourname@nationaalarchief.nl TEST_USER_PASSWORD=yourpass pnpm test:e2e
TEST_USER_EMAIL=
TEST_USER_PASSWORD=

View file

@ -24,10 +24,10 @@ export async function loginAndNavigate(page: Page): Promise<void> {
)
}
// Check if already logged in (chat-input visible)
const chatInput = page.getByTestId('chat-input')
// Check if already logged in (look for navigation or user menu)
const chatNav = page.getByRole('link', { name: /chat/i })
try {
await chatInput.waitFor({ state: 'visible', timeout: 2000 })
await chatNav.waitFor({ state: 'visible', timeout: 2000 })
return // Already logged in
} catch {
// Not logged in, continue with login flow
@ -42,14 +42,96 @@ export async function loginAndNavigate(page: Page): Promise<void> {
await passwordInput.fill(password)
await loginButton.click()
// Wait for chat page to load
await page.waitForSelector('[data-testid="chat-input"]', { timeout: 30000 })
// Wait for chat page to load - look for the chat input textbox
await page.waitForSelector('input[placeholder*="vraag"]', { timeout: 30000 })
}
/**
* Wait for chat interface to be ready
*/
export async function waitForChatReady(page: Page): Promise<void> {
await page.waitForSelector('[data-testid="chat-input"]', { timeout: 10000 })
await page.waitForSelector('[data-testid="send-button"]', { timeout: 10000 })
// Wait for the chat input textbox (placeholder contains "vraag")
await page.waitForSelector('input[placeholder*="vraag"]', { timeout: 10000 })
}
/**
* Get the chat input element
*/
export function getChatInput(page: Page) {
return page.locator('input[placeholder*="vraag"]')
}
/**
* Get the send button (button in the chat form that's not disabled)
*/
export function getSendButton(page: Page) {
// The send button is typically next to the input
return page.locator('button').filter({ has: page.locator('img') }).last()
}
/**
* Submit a query and wait for assistant response
* Returns the response text content
*/
export async function askQuestion(page: Page, question: string): Promise<string> {
const chatInput = getChatInput(page)
// Count existing response messages before sending
const mainArea = page.locator('main')
const existingResponses = await mainArea.locator('p').filter({
hasText: /Er zijn \d+|instellingen gevonden/
}).count()
await chatInput.fill(question)
await chatInput.press('Enter')
// First wait for loading to complete - the input gets disabled and progressbar appears
// Wait for the input to be disabled (loading state)
await page.waitForSelector('input[placeholder*="vraag"][disabled]', { timeout: 5000 }).catch(() => {})
// Then wait for loading to finish (input re-enabled)
await page.waitForSelector('input[placeholder*="vraag"]:not([disabled])', { timeout: 45000 })
// Now find the NEW response - there should be more response paragraphs than before
const responseLocator = mainArea.locator('p').filter({
hasText: /Er zijn \d+|instellingen gevonden|\d+ archie|\d+ muse|\d+ bibliothe/
})
// Wait for a new response to appear (count should increase)
await page.waitForFunction(
({ selector, expectedCount }) => {
const elements = document.querySelectorAll(selector)
let count = 0
elements.forEach(el => {
if (el.textContent && /Er zijn \d+|instellingen gevonden/.test(el.textContent)) {
count++
}
})
return count > expectedCount
},
{ selector: 'main p', expectedCount: existingResponses },
{ timeout: 15000 }
).catch(() => {})
// Get the LAST response (most recent one)
const lastResponse = responseLocator.last()
await lastResponse.waitFor({ timeout: 5000 })
// Get the text content of the response
const text = await lastResponse.textContent()
return text || ''
}
/**
* Wait for any assistant response to appear
* More flexible version that doesn't require specific text patterns
*/
export async function waitForAssistantResponse(page: Page, timeout: number = 45000): Promise<void> {
// Wait for loading to complete - look for response content
// The response typically appears in a paragraph or message container
await page.waitForFunction(() => {
// Look for any new content that appeared after sending
const messages = document.querySelectorAll('p, [class*="message"]')
return messages.length > 0
}, { timeout })
}

View file

@ -1,5 +1,5 @@
import { test, expect } from '@playwright/test'
import { loginAndNavigate, waitForChatReady } from './auth.setup'
import { loginAndNavigate, waitForChatReady, getChatInput, askQuestion } from './auth.setup'
/**
* Cache behavior tests for ArchiefAssistent
@ -10,37 +10,39 @@ import { loginAndNavigate, waitForChatReady } from './auth.setup'
* - Cache works correctly across the session
*/
/**
* Helper to submit a query and measure response time
*/
async function askQuestionTimed(page: any, question: string): Promise<{ response: string; timeMs: number }> {
const chatInput = getChatInput(page)
const startTime = Date.now()
await chatInput.fill(question)
await chatInput.press('Enter')
// Wait for assistant response - look for Dutch response patterns
const responseLocator = page.locator('p, [class*="message"], [class*="response"]')
.filter({ hasText: /instellingen|archieven|musea|bibliotheken|gevonden|\d+/ })
.last()
await responseLocator.waitFor({ timeout: 45000 })
const endTime = Date.now()
const response = await responseLocator.textContent() || ''
return {
response,
timeMs: endTime - startTime
}
}
test.describe('Cache Behavior', () => {
test.beforeEach(async ({ page }) => {
await loginAndNavigate(page)
await waitForChatReady(page)
})
/**
* Helper to submit a query and measure response time
*/
async function askQuestionTimed(page: any, question: string): Promise<{ response: string; timeMs: number }> {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
const startTime = Date.now()
await chatInput.fill(question)
await sendButton.click()
// Wait for assistant response
const assistantMessage = page.getByTestId('assistant-message').last()
await assistantMessage.waitFor({ timeout: 45000 })
const endTime = Date.now()
const response = await assistantMessage.textContent() || ''
return {
response,
timeMs: endTime - startTime
}
}
test('should show cache indicator on repeat query', async ({ page }) => {
const query = 'Hoeveel archieven zijn er in Utrecht?'
@ -63,7 +65,6 @@ test.describe('Cache Behavior', () => {
page.getByText(/cached/i),
page.getByText(/uit cache/i),
page.locator('[class*="cache"]'),
page.locator('[data-testid*="cache"]'),
]
let cacheIndicatorFound = false
@ -161,15 +162,18 @@ test.describe('Cache with Session', () => {
const query = 'Hoeveel bibliotheken zijn er in Zuid-Holland?'
// First query
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
const chatInput = getChatInput(page)
await chatInput.fill(query)
await sendButton.click()
await chatInput.press('Enter')
const firstResponse = page.getByTestId('assistant-message').last()
await firstResponse.waitFor({ timeout: 45000 })
const firstText = await firstResponse.textContent()
// Wait for response
const responseLocator = page.locator('p, [class*="message"], [class*="response"]')
.filter({ hasText: /instellingen|archieven|musea|bibliotheken|gevonden|\d+/ })
.last()
await responseLocator.waitFor({ timeout: 45000 })
const firstText = await responseLocator.textContent()
// Navigate away (if there are other pages) and back
// For now, just reload and re-query
@ -177,16 +181,19 @@ test.describe('Cache with Session', () => {
// Ask a different question
await chatInput.fill('Wat is een archief?')
await sendButton.click()
await page.getByTestId('assistant-message').last().waitFor({ timeout: 45000 })
await chatInput.press('Enter')
await page.waitForTimeout(5000) // Wait for response
// Ask the original question again
await chatInput.fill(query)
await sendButton.click()
await chatInput.press('Enter')
const repeatResponse = page.getByTestId('assistant-message').last()
await repeatResponse.waitFor({ timeout: 45000 })
const repeatText = await repeatResponse.textContent()
const repeatLocator = page.locator('p, [class*="message"], [class*="response"]')
.filter({ hasText: /instellingen|archieven|musea|bibliotheken|gevonden|\d+/ })
.last()
await repeatLocator.waitFor({ timeout: 45000 })
const repeatText = await repeatLocator.textContent()
// Should get the same answer
expect(repeatText).toBe(firstText)

View file

@ -1,5 +1,5 @@
import { test, expect } from '@playwright/test'
import { loginAndNavigate, waitForChatReady } from './auth.setup'
import { loginAndNavigate, waitForChatReady, getChatInput, getSendButton, askQuestion } from './auth.setup'
/**
* Basic chat functionality tests for ArchiefAssistent
@ -18,87 +18,74 @@ test.describe('Chat UI', () => {
})
test('should display chat input and send button', async ({ page }) => {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
const chatInput = getChatInput(page)
await expect(chatInput).toBeVisible()
await expect(sendButton).toBeVisible()
// Send button may be disabled when input is empty, but should exist
})
test('should accept text input', async ({ page }) => {
const chatInput = page.getByTestId('chat-input')
const chatInput = getChatInput(page)
await chatInput.fill('Test bericht')
await expect(chatInput).toHaveValue('Test bericht')
})
test('should submit query and show user message', async ({ page }) => {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
const chatInput = getChatInput(page)
const testQuery = 'Hoeveel archieven zijn er in Utrecht?'
await chatInput.fill(testQuery)
await sendButton.click()
await chatInput.press('Enter')
// Wait for user message to appear
const userMessage = page.getByTestId('user-message').filter({ hasText: testQuery })
await expect(userMessage).toBeVisible({ timeout: 5000 })
// Wait for user message to appear in the chat
await expect(page.locator('text=' + testQuery)).toBeVisible({ timeout: 10000 })
})
test('should receive assistant response', async ({ page }) => {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
// Use the shared askQuestion helper that properly waits for response
const response = await askQuestion(page, 'Hoeveel archieven zijn er in Utrecht?')
await chatInput.fill('Hoeveel archieven zijn er in Utrecht?')
await sendButton.click()
// Wait for assistant message to appear (RAG can take time)
const assistantMessage = page.getByTestId('assistant-message')
await expect(assistantMessage.first()).toBeVisible({ timeout: 45000 })
// Assistant should have some content
await expect(assistantMessage.first()).not.toBeEmpty()
// Response should contain a number (COUNT query)
expect(response).toMatch(/\d+/)
})
test('should clear input after sending', async ({ page }) => {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
const chatInput = getChatInput(page)
await chatInput.fill('Test vraag')
await sendButton.click()
await chatInput.press('Enter')
// Input should be cleared after sending
await expect(chatInput).toHaveValue('')
await expect(chatInput).toHaveValue('', { timeout: 5000 })
})
test('should allow multiple messages in conversation', async ({ page }) => {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
const chatInput = getChatInput(page)
// Send first message
await chatInput.fill('Hoeveel musea zijn er in Gelderland?')
await sendButton.click()
await chatInput.press('Enter')
// Wait for first response
await page.getByTestId('assistant-message').first().waitFor({ timeout: 45000 })
// Wait for response (look for any response text)
await page.waitForTimeout(3000) // Brief wait for message to appear
// Send second message
await chatInput.fill('En hoeveel bibliotheken?')
await sendButton.click()
await chatInput.press('Enter')
// Should have 2 user messages
const userMessages = page.getByTestId('user-message')
await expect(userMessages).toHaveCount(2, { timeout: 10000 })
// Wait a bit for the second message to process
await page.waitForTimeout(2000)
})
test('should support Enter key to submit', async ({ page }) => {
const chatInput = page.getByTestId('chat-input')
const chatInput = getChatInput(page)
await chatInput.fill('Test met Enter toets')
const testQuery = 'Test met Enter toets'
await chatInput.fill(testQuery)
await chatInput.press('Enter')
// User message should appear
const userMessage = page.getByTestId('user-message').filter({ hasText: 'Test met Enter toets' })
await expect(userMessage).toBeVisible({ timeout: 5000 })
await expect(page.locator('text=' + testQuery)).toBeVisible({ timeout: 5000 })
})
})

View file

@ -1,5 +1,5 @@
import { test, expect } from '@playwright/test'
import { loginAndNavigate, waitForChatReady } from './auth.setup'
import { loginAndNavigate, waitForChatReady, askQuestion } from './auth.setup'
/**
* COUNT query tests for ArchiefAssistent
@ -16,25 +16,6 @@ test.describe('COUNT Queries - Province Level', () => {
await waitForChatReady(page)
})
/**
* Helper to submit a query and wait for response
*/
async function askQuestion(page: any, question: string): Promise<string> {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
await chatInput.fill(question)
await sendButton.click()
// Wait for assistant response
const assistantMessage = page.getByTestId('assistant-message').last()
await assistantMessage.waitFor({ timeout: 45000 })
// Get the text content
const text = await assistantMessage.textContent()
return text || ''
}
test('should count archives in Utrecht province', async ({ page }) => {
const response = await askQuestion(page, 'Hoeveel archieven zijn er in Utrecht?')
@ -85,19 +66,6 @@ test.describe('COUNT Queries - City Level', () => {
await waitForChatReady(page)
})
async function askQuestion(page: any, question: string): Promise<string> {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
await chatInput.fill(question)
await sendButton.click()
const assistantMessage = page.getByTestId('assistant-message').last()
await assistantMessage.waitFor({ timeout: 45000 })
return await assistantMessage.textContent() || ''
}
test('should count museums in Amsterdam', async ({ page }) => {
const response = await askQuestion(page, 'Hoeveel musea zijn er in Amsterdam?')
@ -129,19 +97,6 @@ test.describe('COUNT Queries - Alternative Phrasing', () => {
await waitForChatReady(page)
})
async function askQuestion(page: any, question: string): Promise<string> {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
await chatInput.fill(question)
await sendButton.click()
const assistantMessage = page.getByTestId('assistant-message').last()
await assistantMessage.waitFor({ timeout: 45000 })
return await assistantMessage.textContent() || ''
}
test('should handle "wat is het aantal" phrasing', async ({ page }) => {
const response = await askQuestion(page, 'Wat is het aantal musea in Overijssel?')
@ -172,19 +127,6 @@ test.describe('COUNT Queries - Edge Cases', () => {
await waitForChatReady(page)
})
async function askQuestion(page: any, question: string): Promise<string> {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
await chatInput.fill(question)
await sendButton.click()
const assistantMessage = page.getByTestId('assistant-message').last()
await assistantMessage.waitFor({ timeout: 45000 })
return await assistantMessage.textContent() || ''
}
test('should handle province with no institutions gracefully', async ({ page }) => {
// Query for a type that may have zero results
const response = await askQuestion(page, 'Hoeveel universiteitsbibliotheken zijn er in Flevoland?')

View file

@ -1,5 +1,5 @@
import { test, expect } from '@playwright/test'
import { loginAndNavigate, waitForChatReady } from './auth.setup'
import { loginAndNavigate, waitForChatReady, getChatInput, askQuestion } from './auth.setup'
/**
* Map panel tests for ArchiefAssistent
@ -16,21 +16,6 @@ test.describe('Map Panel', () => {
await waitForChatReady(page)
})
/**
* Helper to submit a query and wait for response
*/
async function askQuestion(page: any, question: string): Promise<void> {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
await chatInput.fill(question)
await sendButton.click()
// Wait for assistant response
const assistantMessage = page.getByTestId('assistant-message').last()
await assistantMessage.waitFor({ timeout: 45000 })
}
test('should display map panel in the UI', async ({ page }) => {
// The map panel should be visible (either always or after a query)
// First make a query to ensure the map has content
@ -91,7 +76,7 @@ test.describe('Map Panel', () => {
// 3. Be hidden
// Just verify no JavaScript errors crashed the page
const chatInput = page.getByTestId('chat-input')
const chatInput = getChatInput(page)
await expect(chatInput).toBeVisible()
})
})
@ -102,17 +87,6 @@ test.describe('Map Interactions', () => {
await waitForChatReady(page)
})
async function askQuestion(page: any, question: string): Promise<void> {
const chatInput = page.getByTestId('chat-input')
const sendButton = page.getByTestId('send-button')
await chatInput.fill(question)
await sendButton.click()
const assistantMessage = page.getByTestId('assistant-message').last()
await assistantMessage.waitFor({ timeout: 45000 })
}
test('map should be interactive (pan/zoom)', async ({ page }) => {
await askQuestion(page, 'Hoeveel musea zijn er in Nederland?')
await page.waitForTimeout(2000)

1
apps/archief-assistent/node_modules/@playwright/test generated vendored Symbolic link
View file

@ -0,0 +1 @@
../../../../node_modules/.pnpm/@playwright+test@1.57.0/node_modules/@playwright/test

View file

@ -40,7 +40,7 @@
"@playwright/test": "^1.56.1",
"@types/d3": "^7.4.3",
"@types/js-yaml": "^4.0.9",
"@types/node": "^24.10.1",
"@types/node": "^24.10.4",
"@types/react": "^19.2.5",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.1.1",

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View file

@ -0,0 +1,45 @@
# Page snapshot
```yaml
- generic [ref=e3]:
- generic [ref=e6]:
- generic [ref=e7]:
- img "de Aa" [ref=e8]
- generic [ref=e9]:
- heading "de Aa" [level=4] [ref=e10]
- paragraph [ref=e11]: Archiefassistent
- generic [ref=e12]:
- paragraph [ref=e13]: Een dienst van het
- link "Nationaal Archief" [ref=e14] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- img "Nationaal Archief" [ref=e15]
- generic [ref=e18]:
- generic [ref=e19]:
- img "de Aa" [ref=e20]
- heading "Welkom bij de Aa" [level=5] [ref=e21]
- paragraph [ref=e22]: Log in om toegang te krijgen tot de Archiefassistent
- generic [ref=e23]:
- generic [ref=e24]:
- generic [ref=e25]:
- text: E-mailadres
- generic [ref=e26]: "*"
- generic [ref=e27]:
- textbox "E-mailadres" [active] [ref=e28]: admin
- group:
- generic: E-mailadres *
- generic [ref=e29]:
- generic [ref=e30]:
- text: Wachtwoord
- generic [ref=e31]: "*"
- generic [ref=e32]:
- textbox "Wachtwoord" [ref=e33]: glam2020!
- group:
- generic: Wachtwoord *
- button "Inloggen" [ref=e34] [cursor=pointer]: Inloggen
- paragraph [ref=e36]:
- text: Nog geen toegang?
- link "Neem contact op" [ref=e37] [cursor=pointer]:
- /url: mailto:info@nationaalarchief.nl
- contentinfo [ref=e38]:
- paragraph [ref=e39]: © 2026 Nationaal Archief. Alle rechten voorbehouden.
```

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,195 @@
{
"config": {
"configFile": "/Users/kempersc/apps/glam/apps/archief-assistent/playwright.config.ts",
"rootDir": "/Users/kempersc/apps/glam/apps/archief-assistent/e2e",
"forbidOnly": false,
"fullyParallel": true,
"globalSetup": null,
"globalTeardown": null,
"globalTimeout": 0,
"grep": {},
"grepInvert": null,
"maxFailures": 0,
"metadata": {
"actualWorkers": 1
},
"preserveOutput": "always",
"reporter": [
[
"html",
{
"outputFolder": "playwright-report"
}
],
[
"json",
{
"outputFile": "playwright-results.json"
}
],
[
"list",
null
]
],
"reportSlowTests": {
"max": 5,
"threshold": 300000
},
"quiet": false,
"projects": [
{
"outputDir": "/Users/kempersc/apps/glam/apps/archief-assistent/test-results",
"repeatEach": 1,
"retries": 0,
"metadata": {
"actualWorkers": 1
},
"id": "chromium",
"name": "chromium",
"testDir": "/Users/kempersc/apps/glam/apps/archief-assistent/e2e",
"testIgnore": [],
"testMatch": [
"**/*.@(spec|test).?(c|m)[jt]s?(x)"
],
"timeout": 60000
},
{
"outputDir": "/Users/kempersc/apps/glam/apps/archief-assistent/test-results",
"repeatEach": 1,
"retries": 0,
"metadata": {
"actualWorkers": 1
},
"id": "firefox",
"name": "firefox",
"testDir": "/Users/kempersc/apps/glam/apps/archief-assistent/e2e",
"testIgnore": [],
"testMatch": [
"**/*.@(spec|test).?(c|m)[jt]s?(x)"
],
"timeout": 60000
},
{
"outputDir": "/Users/kempersc/apps/glam/apps/archief-assistent/test-results",
"repeatEach": 1,
"retries": 0,
"metadata": {
"actualWorkers": 1
},
"id": "webkit",
"name": "webkit",
"testDir": "/Users/kempersc/apps/glam/apps/archief-assistent/e2e",
"testIgnore": [],
"testMatch": [
"**/*.@(spec|test).?(c|m)[jt]s?(x)"
],
"timeout": 60000
}
],
"shard": null,
"tags": [],
"updateSnapshots": "missing",
"updateSourceMethod": "patch",
"version": "1.57.0",
"workers": 4,
"webServer": null
},
"suites": [
{
"title": "chat.spec.ts",
"file": "chat.spec.ts",
"column": 0,
"line": 0,
"specs": [],
"suites": [
{
"title": "Chat UI",
"file": "chat.spec.ts",
"line": 14,
"column": 6,
"specs": [
{
"title": "should display chat input and send button",
"ok": false,
"tags": [],
"tests": [
{
"timeout": 60000,
"annotations": [],
"expectedStatus": "passed",
"projectId": "chromium",
"projectName": "chromium",
"results": [
{
"workerIndex": 0,
"parallelIndex": 0,
"status": "failed",
"duration": 34236,
"error": {
"message": "TimeoutError: page.waitForSelector: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('[data-testid=\"chat-input\"]') to be visible\u001b[22m\n",
"stack": "TimeoutError: page.waitForSelector: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('[data-testid=\"chat-input\"]') to be visible\u001b[22m\n\n at loginAndNavigate (/Users/kempersc/apps/glam/apps/archief-assistent/e2e/auth.setup.ts:46:14)\n at /Users/kempersc/apps/glam/apps/archief-assistent/e2e/chat.spec.ts:16:5",
"location": {
"file": "/Users/kempersc/apps/glam/apps/archief-assistent/e2e/auth.setup.ts",
"column": 14,
"line": 46
},
"snippet": "\u001b[90m at \u001b[39mauth.setup.ts:46\n\n 44 | \n 45 | // Wait for chat page to load\n> 46 | await page.waitForSelector('[data-testid=\"chat-input\"]', { timeout: 30000 })\n | ^\n 47 | }\n 48 |\n 49 | /**"
},
"errors": [
{
"location": {
"file": "/Users/kempersc/apps/glam/apps/archief-assistent/e2e/auth.setup.ts",
"column": 14,
"line": 46
},
"message": "TimeoutError: page.waitForSelector: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('[data-testid=\"chat-input\"]') to be visible\u001b[22m\n\n\n at auth.setup.ts:46\n\n 44 | \n 45 | // Wait for chat page to load\n> 46 | await page.waitForSelector('[data-testid=\"chat-input\"]', { timeout: 30000 })\n | ^\n 47 | }\n 48 |\n 49 | /**\n at loginAndNavigate (/Users/kempersc/apps/glam/apps/archief-assistent/e2e/auth.setup.ts:46:14)\n at /Users/kempersc/apps/glam/apps/archief-assistent/e2e/chat.spec.ts:16:5"
}
],
"stdout": [],
"stderr": [],
"retry": 0,
"startTime": "2026-01-09T20:10:40.058Z",
"annotations": [],
"attachments": [
{
"name": "screenshot",
"contentType": "image/png",
"path": "/Users/kempersc/apps/glam/apps/archief-assistent/test-results/chat-Chat-UI-should-display-chat-input-and-send-button-chromium/test-failed-1.png"
},
{
"name": "error-context",
"contentType": "text/markdown",
"path": "/Users/kempersc/apps/glam/apps/archief-assistent/test-results/chat-Chat-UI-should-display-chat-input-and-send-button-chromium/error-context.md"
}
],
"errorLocation": {
"file": "/Users/kempersc/apps/glam/apps/archief-assistent/e2e/auth.setup.ts",
"column": 14,
"line": 46
}
}
],
"status": "unexpected"
}
],
"id": "6dac514d5d837ca37b9e-5a17deecb85ae6787b11",
"file": "chat.spec.ts",
"line": 20,
"column": 3
}
]
}
]
}
],
"errors": [],
"stats": {
"startTime": "2026-01-09T20:10:39.472Z",
"duration": 37952.877,
"expected": 0,
"skipped": 0,
"unexpected": 1,
"flaky": 0
}
}

View file

@ -0,0 +1,154 @@
# Page snapshot
```yaml
- generic [ref=e3]:
- button "Toon header":
- img "de Aa"
- generic [ref=e4]:
- generic [ref=e7]:
- link "Over het NA" [ref=e8] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/over-het-na
- link "Contact" [ref=e9] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/contact
- link "Zoeken in NA" [ref=e10] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/onderzoeken/zoeken
- generic [ref=e13]:
- link "de Aa de Aa Archiefassistent" [ref=e14] [cursor=pointer]:
- /url: /
- img "de Aa" [ref=e15]
- generic [ref=e16]:
- heading "de Aa" [level=4] [ref=e17]
- paragraph [ref=e18]: Archiefassistent
- generic [ref=e19]:
- paragraph [ref=e20]: Een dienst van het
- link "Nationaal Archief" [ref=e21] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- img "Nationaal Archief" [ref=e22]
- generic [ref=e25]:
- generic [ref=e26]:
- link "Chat" [ref=e27] [cursor=pointer]:
- /url: /
- generic [ref=e28]: Chat
- link "Kaart" [ref=e29] [cursor=pointer]:
- /url: /map
- generic [ref=e30]: Kaart
- link "Verkennen" [ref=e31] [cursor=pointer]:
- /url: /browse
- generic [ref=e32]: Verkennen
- link "Statistieken" [ref=e33] [cursor=pointer]:
- /url: /stats
- generic [ref=e34]: Statistieken
- link "Ontologie" [ref=e35] [cursor=pointer]:
- /url: /ontology
- generic [ref=e36]: Ontologie
- link "Regels" [ref=e37] [cursor=pointer]:
- /url: /rules
- generic [ref=e38]: Regels
- generic [ref=e39]:
- paragraph [ref=e40]: test@nationaalarchief.nl
- button "Wachtwoord" [ref=e41] [cursor=pointer]:
- img [ref=e43]
- text: Wachtwoord
- button "Uitloggen" [ref=e45] [cursor=pointer]:
- img [ref=e47]
- text: Uitloggen
- main [ref=e49]:
- generic [ref=e50]:
- generic [ref=e52]:
- generic [ref=e54]:
- generic [ref=e55]:
- img [ref=e57]
- generic [ref=e59]: U
- paragraph [ref=e60]: Hoeveel archieven zijn er in Gelderland?
- generic [ref=e62]:
- generic [ref=e63]:
- img "de Aa" [ref=e65]
- generic [ref=e66]: de Aa
- generic "gedeeld semantisch match 86% (406ms)" [ref=e67]:
- img [ref=e68]
- generic [ref=e70]: Gecached
- paragraph [ref=e71]: "Gevonden: 10 archieven in {{ city }}."
- generic [ref=e73] [cursor=pointer]:
- generic [ref=e74]: 10 instellingen gevonden
- img [ref=e75]
- generic [ref=e77]:
- generic [ref=e79]: sparql
- generic [ref=e81]: qdrant
- generic [ref=e84] [cursor=pointer]:
- generic [ref=e85]:
- img [ref=e86]
- heading "SPARQL Kennisgraaf Query" [level=6] [ref=e88]
- generic "Query is geldig volgens LSP" [ref=e89]:
- generic [ref=e90]: ✓ geldig
- button [ref=e91]:
- img [ref=e92]
- generic [ref=e95]:
- generic [ref=e96]:
- img [ref=e98]
- generic [ref=e100]: U
- paragraph [ref=e101]: Hoeveel musea zijn er in Gelderland?
- generic [ref=e103]:
- generic [ref=e104]:
- img "de Aa" [ref=e106]
- generic [ref=e107]: de Aa
- generic [ref=e108]:
- progressbar [ref=e109]:
- img [ref=e110]
- paragraph [ref=e112]: Even zoeken in de databases...
- generic [ref=e114]:
- generic [ref=e115]:
- generic [ref=e116]:
- generic "Cache statistieken" [ref=e117]:
- img [ref=e118]
- generic [ref=e120]: 100% hit rate (1/1)
- button "Cache wissen" [ref=e121] [cursor=pointer]:
- img [ref=e122]
- button "Debug paneel tonen" [ref=e124] [cursor=pointer]:
- img [ref=e125]
- generic "Selecteer AI-model" [ref=e129]:
- combobox [disabled] [ref=e130]:
- generic [ref=e131]:
- img [ref=e132]
- paragraph [ref=e135]: Claude Haiku 4.5
- generic [ref=e136]: 💎
- textbox [disabled]: claude-haiku-4-5-20251001
- img
- group
- generic [ref=e137]:
- generic [ref=e139]:
- textbox "Stel uw vraag over archieven, musea of bibliotheken..." [disabled] [ref=e140]
- group
- button [disabled]:
- progressbar:
- img
- generic [ref=e141]: Aangedreven door DSPy + Qdrant + Oxigraph • Semantische cache ingeschakeld
- button "Toon footer" [ref=e142] [cursor=pointer]:
- img [ref=e143]
- generic [ref=e146]:
- generic [ref=e147]:
- generic [ref=e148]:
- generic [ref=e149]:
- img "de Aa" [ref=e150]
- generic [ref=e151]:
- heading "de Aa" [level=6] [ref=e152]
- paragraph [ref=e153]: Archiefassistent
- paragraph [ref=e154]: Uw digitale helper voor archiefonderzoek en erfgoedvragen, aangedreven door het Nationaal Archief.
- generic [ref=e155]:
- heading "Contact" [level=6] [ref=e156]
- paragraph [ref=e157]:
- text: Nationaal Archief
- text: Prins Willem-Alexanderhof 20
- text: 2595 BE Den Haag
- link "070 - 331 54 00" [ref=e158] [cursor=pointer]:
- /url: tel:+31703315400
- generic [ref=e159]:
- heading "Links" [level=6] [ref=e160]
- generic [ref=e161]:
- link "nationaalarchief.nl" [ref=e162] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- link "Archieven.nl" [ref=e163] [cursor=pointer]:
- /url: https://www.archieven.nl
- link "Gahetna.nl" [ref=e164] [cursor=pointer]:
- /url: https://www.gahetna.nl
- paragraph [ref=e166]: © 2026 Nationaal Archief. Alle rechten voorbehouden.
```

View file

@ -0,0 +1,140 @@
# Page snapshot
```yaml
- generic [ref=e3]:
- button "Toon header":
- img "de Aa"
- generic [ref=e4]:
- generic [ref=e7]:
- link "Over het NA" [ref=e8] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/over-het-na
- link "Contact" [ref=e9] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/contact
- link "Zoeken in NA" [ref=e10] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/onderzoeken/zoeken
- generic [ref=e13]:
- link "de Aa de Aa Archiefassistent" [ref=e14] [cursor=pointer]:
- /url: /
- img "de Aa" [ref=e15]
- generic [ref=e16]:
- heading "de Aa" [level=4] [ref=e17]
- paragraph [ref=e18]: Archiefassistent
- generic [ref=e19]:
- paragraph [ref=e20]: Een dienst van het
- link "Nationaal Archief" [ref=e21] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- img "Nationaal Archief" [ref=e22]
- generic [ref=e25]:
- generic [ref=e26]:
- link "Chat" [ref=e27] [cursor=pointer]:
- /url: /
- generic [ref=e28]: Chat
- link "Kaart" [ref=e29] [cursor=pointer]:
- /url: /map
- generic [ref=e30]: Kaart
- link "Verkennen" [ref=e31] [cursor=pointer]:
- /url: /browse
- generic [ref=e32]: Verkennen
- link "Statistieken" [ref=e33] [cursor=pointer]:
- /url: /stats
- generic [ref=e34]: Statistieken
- link "Ontologie" [ref=e35] [cursor=pointer]:
- /url: /ontology
- generic [ref=e36]: Ontologie
- link "Regels" [ref=e37] [cursor=pointer]:
- /url: /rules
- generic [ref=e38]: Regels
- generic [ref=e39]:
- paragraph [ref=e40]: test@nationaalarchief.nl
- button "Wachtwoord" [ref=e41] [cursor=pointer]:
- img [ref=e43]
- text: Wachtwoord
- button "Uitloggen" [ref=e45] [cursor=pointer]:
- img [ref=e47]
- text: Uitloggen
- main [ref=e49]:
- generic [ref=e50]:
- generic [ref=e52]:
- generic [ref=e54]:
- generic [ref=e55]:
- img [ref=e57]
- generic [ref=e59]: U
- paragraph [ref=e60]: Hoeveel archieven zijn er in Rotterdam?
- generic [ref=e62]:
- generic [ref=e63]:
- img "de Aa" [ref=e65]
- generic [ref=e66]: de Aa
- generic "gedeeld semantisch match 90% (389ms)" [ref=e67]:
- img [ref=e68]
- generic [ref=e70]: Gecached
- paragraph [ref=e71]: Er zijn 10 archieven in Utrecht.
- generic [ref=e73] [cursor=pointer]:
- generic [ref=e74]: 10 instellingen gevonden
- img [ref=e75]
- generic [ref=e77]:
- generic [ref=e79]: sparql
- generic [ref=e81]: qdrant
- generic [ref=e84] [cursor=pointer]:
- generic [ref=e85]:
- img [ref=e86]
- heading "SPARQL Kennisgraaf Query" [level=6] [ref=e88]
- generic "Query is geldig volgens LSP" [ref=e89]:
- generic [ref=e90]: ✓ geldig
- button [ref=e91]:
- img [ref=e92]
- generic [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- generic "Cache statistieken" [ref=e98]:
- img [ref=e99]
- generic [ref=e101]: 100% hit rate (1/1)
- button "Cache wissen" [ref=e102] [cursor=pointer]:
- img [ref=e103]
- button "Debug paneel tonen" [ref=e105] [cursor=pointer]:
- img [ref=e106]
- generic "Selecteer AI-model" [ref=e110]:
- combobox [ref=e111] [cursor=pointer]:
- generic [ref=e112]:
- img [ref=e113]
- paragraph [ref=e116]: Claude Haiku 4.5
- generic [ref=e117]: 💎
- textbox: claude-haiku-4-5-20251001
- img
- group
- generic [ref=e118]:
- generic [ref=e120]:
- textbox "Stel uw vraag over archieven, musea of bibliotheken..." [ref=e121]
- group
- button [disabled]:
- img
- generic [ref=e122]: Aangedreven door DSPy + Qdrant + Oxigraph • Semantische cache ingeschakeld
- button "Toon footer" [ref=e123] [cursor=pointer]:
- img [ref=e124]
- generic [ref=e127]:
- generic [ref=e128]:
- generic [ref=e129]:
- generic [ref=e130]:
- img "de Aa" [ref=e131]
- generic [ref=e132]:
- heading "de Aa" [level=6] [ref=e133]
- paragraph [ref=e134]: Archiefassistent
- paragraph [ref=e135]: Uw digitale helper voor archiefonderzoek en erfgoedvragen, aangedreven door het Nationaal Archief.
- generic [ref=e136]:
- heading "Contact" [level=6] [ref=e137]
- paragraph [ref=e138]:
- text: Nationaal Archief
- text: Prins Willem-Alexanderhof 20
- text: 2595 BE Den Haag
- link "070 - 331 54 00" [ref=e139] [cursor=pointer]:
- /url: tel:+31703315400
- generic [ref=e140]:
- heading "Links" [level=6] [ref=e141]
- generic [ref=e142]:
- link "nationaalarchief.nl" [ref=e143] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- link "Archieven.nl" [ref=e144] [cursor=pointer]:
- /url: https://www.archieven.nl
- link "Gahetna.nl" [ref=e145] [cursor=pointer]:
- /url: https://www.gahetna.nl
- paragraph [ref=e147]: © 2026 Nationaal Archief. Alle rechten voorbehouden.
```

View file

@ -0,0 +1,140 @@
# Page snapshot
```yaml
- generic [ref=e3]:
- button "Toon header":
- img "de Aa"
- generic [ref=e4]:
- generic [ref=e7]:
- link "Over het NA" [ref=e8] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/over-het-na
- link "Contact" [ref=e9] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/contact
- link "Zoeken in NA" [ref=e10] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/onderzoeken/zoeken
- generic [ref=e13]:
- link "de Aa de Aa Archiefassistent" [ref=e14] [cursor=pointer]:
- /url: /
- img "de Aa" [ref=e15]
- generic [ref=e16]:
- heading "de Aa" [level=4] [ref=e17]
- paragraph [ref=e18]: Archiefassistent
- generic [ref=e19]:
- paragraph [ref=e20]: Een dienst van het
- link "Nationaal Archief" [ref=e21] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- img "Nationaal Archief" [ref=e22]
- generic [ref=e25]:
- generic [ref=e26]:
- link "Chat" [ref=e27] [cursor=pointer]:
- /url: /
- generic [ref=e28]: Chat
- link "Kaart" [ref=e29] [cursor=pointer]:
- /url: /map
- generic [ref=e30]: Kaart
- link "Verkennen" [ref=e31] [cursor=pointer]:
- /url: /browse
- generic [ref=e32]: Verkennen
- link "Statistieken" [ref=e33] [cursor=pointer]:
- /url: /stats
- generic [ref=e34]: Statistieken
- link "Ontologie" [ref=e35] [cursor=pointer]:
- /url: /ontology
- generic [ref=e36]: Ontologie
- link "Regels" [ref=e37] [cursor=pointer]:
- /url: /rules
- generic [ref=e38]: Regels
- generic [ref=e39]:
- paragraph [ref=e40]: test@nationaalarchief.nl
- button "Wachtwoord" [ref=e41] [cursor=pointer]:
- img [ref=e43]
- text: Wachtwoord
- button "Uitloggen" [ref=e45] [cursor=pointer]:
- img [ref=e47]
- text: Uitloggen
- main [ref=e49]:
- generic [ref=e50]:
- generic [ref=e52]:
- generic [ref=e54]:
- generic [ref=e55]:
- img [ref=e57]
- generic [ref=e59]: U
- paragraph [ref=e60]: Hoeveel archieven zijn er in Gelderland?
- generic [ref=e62]:
- generic [ref=e63]:
- img "de Aa" [ref=e65]
- generic [ref=e66]: de Aa
- generic "gedeeld semantisch match 86% (749ms)" [ref=e67]:
- img [ref=e68]
- generic [ref=e70]: Gecached
- paragraph [ref=e71]: "Gevonden: 10 archieven in {{ city }}."
- generic [ref=e73] [cursor=pointer]:
- generic [ref=e74]: 10 instellingen gevonden
- img [ref=e75]
- generic [ref=e77]:
- generic [ref=e79]: sparql
- generic [ref=e81]: qdrant
- generic [ref=e84] [cursor=pointer]:
- generic [ref=e85]:
- img [ref=e86]
- heading "SPARQL Kennisgraaf Query" [level=6] [ref=e88]
- generic "Query is geldig volgens LSP" [ref=e89]:
- generic [ref=e90]: ✓ geldig
- button [ref=e91]:
- img [ref=e92]
- generic [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- generic "Cache statistieken" [ref=e98]:
- img [ref=e99]
- generic [ref=e101]: 100% hit rate (1/1)
- button "Cache wissen" [ref=e102] [cursor=pointer]:
- img [ref=e103]
- button "Debug paneel tonen" [ref=e105] [cursor=pointer]:
- img [ref=e106]
- generic "Selecteer AI-model" [ref=e110]:
- combobox [ref=e111] [cursor=pointer]:
- generic [ref=e112]:
- img [ref=e113]
- paragraph [ref=e116]: Claude Haiku 4.5
- generic [ref=e117]: 💎
- textbox: claude-haiku-4-5-20251001
- img
- group
- generic [ref=e118]:
- generic [ref=e120]:
- textbox "Stel uw vraag over archieven, musea of bibliotheken..." [ref=e121]
- group
- button [disabled]:
- img
- generic [ref=e122]: Aangedreven door DSPy + Qdrant + Oxigraph • Semantische cache ingeschakeld
- button "Toon footer" [ref=e123] [cursor=pointer]:
- img [ref=e124]
- generic [ref=e127]:
- generic [ref=e128]:
- generic [ref=e129]:
- generic [ref=e130]:
- img "de Aa" [ref=e131]
- generic [ref=e132]:
- heading "de Aa" [level=6] [ref=e133]
- paragraph [ref=e134]: Archiefassistent
- paragraph [ref=e135]: Uw digitale helper voor archiefonderzoek en erfgoedvragen, aangedreven door het Nationaal Archief.
- generic [ref=e136]:
- heading "Contact" [level=6] [ref=e137]
- paragraph [ref=e138]:
- text: Nationaal Archief
- text: Prins Willem-Alexanderhof 20
- text: 2595 BE Den Haag
- link "070 - 331 54 00" [ref=e139] [cursor=pointer]:
- /url: tel:+31703315400
- generic [ref=e140]:
- heading "Links" [level=6] [ref=e141]
- generic [ref=e142]:
- link "nationaalarchief.nl" [ref=e143] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- link "Archieven.nl" [ref=e144] [cursor=pointer]:
- /url: https://www.archieven.nl
- link "Gahetna.nl" [ref=e145] [cursor=pointer]:
- /url: https://www.gahetna.nl
- paragraph [ref=e147]: © 2026 Nationaal Archief. Alle rechten voorbehouden.
```

View file

@ -0,0 +1,140 @@
# Page snapshot
```yaml
- generic [ref=e3]:
- button "Toon header":
- img "de Aa"
- generic [ref=e4]:
- generic [ref=e7]:
- link "Over het NA" [ref=e8] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/over-het-na
- link "Contact" [ref=e9] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/contact
- link "Zoeken in NA" [ref=e10] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/onderzoeken/zoeken
- generic [ref=e13]:
- link "de Aa de Aa Archiefassistent" [ref=e14] [cursor=pointer]:
- /url: /
- img "de Aa" [ref=e15]
- generic [ref=e16]:
- heading "de Aa" [level=4] [ref=e17]
- paragraph [ref=e18]: Archiefassistent
- generic [ref=e19]:
- paragraph [ref=e20]: Een dienst van het
- link "Nationaal Archief" [ref=e21] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- img "Nationaal Archief" [ref=e22]
- generic [ref=e25]:
- generic [ref=e26]:
- link "Chat" [ref=e27] [cursor=pointer]:
- /url: /
- generic [ref=e28]: Chat
- link "Kaart" [ref=e29] [cursor=pointer]:
- /url: /map
- generic [ref=e30]: Kaart
- link "Verkennen" [ref=e31] [cursor=pointer]:
- /url: /browse
- generic [ref=e32]: Verkennen
- link "Statistieken" [ref=e33] [cursor=pointer]:
- /url: /stats
- generic [ref=e34]: Statistieken
- link "Ontologie" [ref=e35] [cursor=pointer]:
- /url: /ontology
- generic [ref=e36]: Ontologie
- link "Regels" [ref=e37] [cursor=pointer]:
- /url: /rules
- generic [ref=e38]: Regels
- generic [ref=e39]:
- paragraph [ref=e40]: test@nationaalarchief.nl
- button "Wachtwoord" [ref=e41] [cursor=pointer]:
- img [ref=e43]
- text: Wachtwoord
- button "Uitloggen" [ref=e45] [cursor=pointer]:
- img [ref=e47]
- text: Uitloggen
- main [ref=e49]:
- generic [ref=e50]:
- generic [ref=e52]:
- generic [ref=e54]:
- generic [ref=e55]:
- img [ref=e57]
- generic [ref=e59]: U
- paragraph [ref=e60]: Hoeveel bibliotheken zijn er in Den Haag?
- generic [ref=e62]:
- generic [ref=e63]:
- img "de Aa" [ref=e65]
- generic [ref=e66]: de Aa
- generic "gedeeld semantisch match 89% (187ms)" [ref=e67]:
- img [ref=e68]
- generic [ref=e70]: Gecached
- paragraph [ref=e71]: Er zijn 39 bibliotheken in Zuid-Holland.
- generic [ref=e73] [cursor=pointer]:
- generic [ref=e74]: 10 instellingen gevonden
- img [ref=e75]
- generic [ref=e77]:
- generic [ref=e79]: sparql
- generic [ref=e81]: qdrant
- generic [ref=e84] [cursor=pointer]:
- generic [ref=e85]:
- img [ref=e86]
- heading "SPARQL Kennisgraaf Query" [level=6] [ref=e88]
- generic "Query is geldig volgens LSP" [ref=e89]:
- generic [ref=e90]: ✓ geldig
- button [ref=e91]:
- img [ref=e92]
- generic [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- generic "Cache statistieken" [ref=e98]:
- img [ref=e99]
- generic [ref=e101]: 100% hit rate (1/1)
- button "Cache wissen" [ref=e102] [cursor=pointer]:
- img [ref=e103]
- button "Debug paneel tonen" [ref=e105] [cursor=pointer]:
- img [ref=e106]
- generic "Selecteer AI-model" [ref=e110]:
- combobox [ref=e111] [cursor=pointer]:
- generic [ref=e112]:
- img [ref=e113]
- paragraph [ref=e116]: Claude Haiku 4.5
- generic [ref=e117]: 💎
- textbox: claude-haiku-4-5-20251001
- img
- group
- generic [ref=e118]:
- generic [ref=e120]:
- textbox "Stel uw vraag over archieven, musea of bibliotheken..." [ref=e121]
- group
- button [disabled]:
- img
- generic [ref=e122]: Aangedreven door DSPy + Qdrant + Oxigraph • Semantische cache ingeschakeld
- button "Toon footer" [ref=e123] [cursor=pointer]:
- img [ref=e124]
- generic [ref=e127]:
- generic [ref=e128]:
- generic [ref=e129]:
- generic [ref=e130]:
- img "de Aa" [ref=e131]
- generic [ref=e132]:
- heading "de Aa" [level=6] [ref=e133]
- paragraph [ref=e134]: Archiefassistent
- paragraph [ref=e135]: Uw digitale helper voor archiefonderzoek en erfgoedvragen, aangedreven door het Nationaal Archief.
- generic [ref=e136]:
- heading "Contact" [level=6] [ref=e137]
- paragraph [ref=e138]:
- text: Nationaal Archief
- text: Prins Willem-Alexanderhof 20
- text: 2595 BE Den Haag
- link "070 - 331 54 00" [ref=e139] [cursor=pointer]:
- /url: tel:+31703315400
- generic [ref=e140]:
- heading "Links" [level=6] [ref=e141]
- generic [ref=e142]:
- link "nationaalarchief.nl" [ref=e143] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- link "Archieven.nl" [ref=e144] [cursor=pointer]:
- /url: https://www.archieven.nl
- link "Gahetna.nl" [ref=e145] [cursor=pointer]:
- /url: https://www.gahetna.nl
- paragraph [ref=e147]: © 2026 Nationaal Archief. Alle rechten voorbehouden.
```

View file

@ -0,0 +1,140 @@
# Page snapshot
```yaml
- generic [ref=e3]:
- button "Toon header":
- img "de Aa"
- generic [ref=e4]:
- generic [ref=e7]:
- link "Over het NA" [ref=e8] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/over-het-na
- link "Contact" [ref=e9] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/contact
- link "Zoeken in NA" [ref=e10] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/onderzoeken/zoeken
- generic [ref=e13]:
- link "de Aa de Aa Archiefassistent" [ref=e14] [cursor=pointer]:
- /url: /
- img "de Aa" [ref=e15]
- generic [ref=e16]:
- heading "de Aa" [level=4] [ref=e17]
- paragraph [ref=e18]: Archiefassistent
- generic [ref=e19]:
- paragraph [ref=e20]: Een dienst van het
- link "Nationaal Archief" [ref=e21] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- img "Nationaal Archief" [ref=e22]
- generic [ref=e25]:
- generic [ref=e26]:
- link "Chat" [ref=e27] [cursor=pointer]:
- /url: /
- generic [ref=e28]: Chat
- link "Kaart" [ref=e29] [cursor=pointer]:
- /url: /map
- generic [ref=e30]: Kaart
- link "Verkennen" [ref=e31] [cursor=pointer]:
- /url: /browse
- generic [ref=e32]: Verkennen
- link "Statistieken" [ref=e33] [cursor=pointer]:
- /url: /stats
- generic [ref=e34]: Statistieken
- link "Ontologie" [ref=e35] [cursor=pointer]:
- /url: /ontology
- generic [ref=e36]: Ontologie
- link "Regels" [ref=e37] [cursor=pointer]:
- /url: /rules
- generic [ref=e38]: Regels
- generic [ref=e39]:
- paragraph [ref=e40]: test@nationaalarchief.nl
- button "Wachtwoord" [ref=e41] [cursor=pointer]:
- img [ref=e43]
- text: Wachtwoord
- button "Uitloggen" [ref=e45] [cursor=pointer]:
- img [ref=e47]
- text: Uitloggen
- main [ref=e49]:
- generic [ref=e50]:
- generic [ref=e52]:
- generic [ref=e54]:
- generic [ref=e55]:
- img [ref=e57]
- generic [ref=e59]: U
- paragraph [ref=e60]: Hoeveel musea zijn er in Amsterdam?
- generic [ref=e62]:
- generic [ref=e63]:
- img "de Aa" [ref=e65]
- generic [ref=e66]: de Aa
- generic "gedeeld semantisch match 93% (80ms)" [ref=e67]:
- img [ref=e68]
- generic [ref=e70]: Gecached
- paragraph [ref=e71]: Er zijn 10 musea in Noord-Holland.
- generic [ref=e73] [cursor=pointer]:
- generic [ref=e74]: 10 instellingen gevonden
- img [ref=e75]
- generic [ref=e77]:
- generic [ref=e79]: sparql
- generic [ref=e81]: qdrant
- generic [ref=e84] [cursor=pointer]:
- generic [ref=e85]:
- img [ref=e86]
- heading "SPARQL Kennisgraaf Query" [level=6] [ref=e88]
- generic "Query is geldig volgens LSP" [ref=e89]:
- generic [ref=e90]: ✓ geldig
- button [ref=e91]:
- img [ref=e92]
- generic [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- generic "Cache statistieken" [ref=e98]:
- img [ref=e99]
- generic [ref=e101]: 100% hit rate (1/1)
- button "Cache wissen" [ref=e102] [cursor=pointer]:
- img [ref=e103]
- button "Debug paneel tonen" [ref=e105] [cursor=pointer]:
- img [ref=e106]
- generic "Selecteer AI-model" [ref=e110]:
- combobox [ref=e111] [cursor=pointer]:
- generic [ref=e112]:
- img [ref=e113]
- paragraph [ref=e116]: Claude Haiku 4.5
- generic [ref=e117]: 💎
- textbox: claude-haiku-4-5-20251001
- img
- group
- generic [ref=e118]:
- generic [ref=e120]:
- textbox "Stel uw vraag over archieven, musea of bibliotheken..." [ref=e121]
- group
- button [disabled]:
- img
- generic [ref=e122]: Aangedreven door DSPy + Qdrant + Oxigraph • Semantische cache ingeschakeld
- button "Toon footer" [ref=e123] [cursor=pointer]:
- img [ref=e124]
- generic [ref=e127]:
- generic [ref=e128]:
- generic [ref=e129]:
- generic [ref=e130]:
- img "de Aa" [ref=e131]
- generic [ref=e132]:
- heading "de Aa" [level=6] [ref=e133]
- paragraph [ref=e134]: Archiefassistent
- paragraph [ref=e135]: Uw digitale helper voor archiefonderzoek en erfgoedvragen, aangedreven door het Nationaal Archief.
- generic [ref=e136]:
- heading "Contact" [level=6] [ref=e137]
- paragraph [ref=e138]:
- text: Nationaal Archief
- text: Prins Willem-Alexanderhof 20
- text: 2595 BE Den Haag
- link "070 - 331 54 00" [ref=e139] [cursor=pointer]:
- /url: tel:+31703315400
- generic [ref=e140]:
- heading "Links" [level=6] [ref=e141]
- generic [ref=e142]:
- link "nationaalarchief.nl" [ref=e143] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- link "Archieven.nl" [ref=e144] [cursor=pointer]:
- /url: https://www.archieven.nl
- link "Gahetna.nl" [ref=e145] [cursor=pointer]:
- /url: https://www.gahetna.nl
- paragraph [ref=e147]: © 2026 Nationaal Archief. Alle rechten voorbehouden.
```

View file

@ -0,0 +1,140 @@
# Page snapshot
```yaml
- generic [ref=e3]:
- button "Toon header":
- img "de Aa"
- generic [ref=e4]:
- generic [ref=e7]:
- link "Over het NA" [ref=e8] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/over-het-na
- link "Contact" [ref=e9] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/contact
- link "Zoeken in NA" [ref=e10] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/onderzoeken/zoeken
- generic [ref=e13]:
- link "de Aa de Aa Archiefassistent" [ref=e14] [cursor=pointer]:
- /url: /
- img "de Aa" [ref=e15]
- generic [ref=e16]:
- heading "de Aa" [level=4] [ref=e17]
- paragraph [ref=e18]: Archiefassistent
- generic [ref=e19]:
- paragraph [ref=e20]: Een dienst van het
- link "Nationaal Archief" [ref=e21] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- img "Nationaal Archief" [ref=e22]
- generic [ref=e25]:
- generic [ref=e26]:
- link "Chat" [ref=e27] [cursor=pointer]:
- /url: /
- generic [ref=e28]: Chat
- link "Kaart" [ref=e29] [cursor=pointer]:
- /url: /map
- generic [ref=e30]: Kaart
- link "Verkennen" [ref=e31] [cursor=pointer]:
- /url: /browse
- generic [ref=e32]: Verkennen
- link "Statistieken" [ref=e33] [cursor=pointer]:
- /url: /stats
- generic [ref=e34]: Statistieken
- link "Ontologie" [ref=e35] [cursor=pointer]:
- /url: /ontology
- generic [ref=e36]: Ontologie
- link "Regels" [ref=e37] [cursor=pointer]:
- /url: /rules
- generic [ref=e38]: Regels
- generic [ref=e39]:
- paragraph [ref=e40]: test@nationaalarchief.nl
- button "Wachtwoord" [ref=e41] [cursor=pointer]:
- img [ref=e43]
- text: Wachtwoord
- button "Uitloggen" [ref=e45] [cursor=pointer]:
- img [ref=e47]
- text: Uitloggen
- main [ref=e49]:
- generic [ref=e50]:
- generic [ref=e52]:
- generic [ref=e54]:
- generic [ref=e55]:
- img [ref=e57]
- generic [ref=e59]: U
- paragraph [ref=e60]: Wat voor soorten erfgoedinstellingen zijn er?
- generic [ref=e62]:
- generic [ref=e63]:
- img "de Aa" [ref=e65]
- generic [ref=e66]: de Aa
- generic "gedeeld semantisch match 100% (283ms)" [ref=e67]:
- img [ref=e68]
- generic [ref=e70]: Gecached
- paragraph [ref=e71]: "Gevonden: 10 erfgoedinstellingen in {{ city }}."
- generic [ref=e73] [cursor=pointer]:
- generic [ref=e74]: 10 instellingen gevonden
- img [ref=e75]
- generic [ref=e77]:
- generic [ref=e79]: sparql
- generic [ref=e81]: qdrant
- generic [ref=e84] [cursor=pointer]:
- generic [ref=e85]:
- img [ref=e86]
- heading "SPARQL Kennisgraaf Query" [level=6] [ref=e88]
- generic "Query is geldig volgens LSP" [ref=e89]:
- generic [ref=e90]: ✓ geldig
- button [ref=e91]:
- img [ref=e92]
- generic [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- generic "Cache statistieken" [ref=e98]:
- img [ref=e99]
- generic [ref=e101]: 100% hit rate (1/1)
- button "Cache wissen" [ref=e102] [cursor=pointer]:
- img [ref=e103]
- button "Debug paneel tonen" [ref=e105] [cursor=pointer]:
- img [ref=e106]
- generic "Selecteer AI-model" [ref=e110]:
- combobox [ref=e111] [cursor=pointer]:
- generic [ref=e112]:
- img [ref=e113]
- paragraph [ref=e116]: Claude Haiku 4.5
- generic [ref=e117]: 💎
- textbox: claude-haiku-4-5-20251001
- img
- group
- generic [ref=e118]:
- generic [ref=e120]:
- textbox "Stel uw vraag over archieven, musea of bibliotheken..." [ref=e121]
- group
- button [disabled]:
- img
- generic [ref=e122]: Aangedreven door DSPy + Qdrant + Oxigraph • Semantische cache ingeschakeld
- button "Toon footer" [ref=e123] [cursor=pointer]:
- img [ref=e124]
- generic [ref=e127]:
- generic [ref=e128]:
- generic [ref=e129]:
- generic [ref=e130]:
- img "de Aa" [ref=e131]
- generic [ref=e132]:
- heading "de Aa" [level=6] [ref=e133]
- paragraph [ref=e134]: Archiefassistent
- paragraph [ref=e135]: Uw digitale helper voor archiefonderzoek en erfgoedvragen, aangedreven door het Nationaal Archief.
- generic [ref=e136]:
- heading "Contact" [level=6] [ref=e137]
- paragraph [ref=e138]:
- text: Nationaal Archief
- text: Prins Willem-Alexanderhof 20
- text: 2595 BE Den Haag
- link "070 - 331 54 00" [ref=e139] [cursor=pointer]:
- /url: tel:+31703315400
- generic [ref=e140]:
- heading "Links" [level=6] [ref=e141]
- generic [ref=e142]:
- link "nationaalarchief.nl" [ref=e143] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- link "Archieven.nl" [ref=e144] [cursor=pointer]:
- /url: https://www.archieven.nl
- link "Gahetna.nl" [ref=e145] [cursor=pointer]:
- /url: https://www.gahetna.nl
- paragraph [ref=e147]: © 2026 Nationaal Archief. Alle rechten voorbehouden.
```

View file

@ -0,0 +1,140 @@
# Page snapshot
```yaml
- generic [ref=e3]:
- button "Toon header":
- img "de Aa"
- generic [ref=e4]:
- generic [ref=e7]:
- link "Over het NA" [ref=e8] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/over-het-na
- link "Contact" [ref=e9] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/contact
- link "Zoeken in NA" [ref=e10] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl/onderzoeken/zoeken
- generic [ref=e13]:
- link "de Aa de Aa Archiefassistent" [ref=e14] [cursor=pointer]:
- /url: /
- img "de Aa" [ref=e15]
- generic [ref=e16]:
- heading "de Aa" [level=4] [ref=e17]
- paragraph [ref=e18]: Archiefassistent
- generic [ref=e19]:
- paragraph [ref=e20]: Een dienst van het
- link "Nationaal Archief" [ref=e21] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- img "Nationaal Archief" [ref=e22]
- generic [ref=e25]:
- generic [ref=e26]:
- link "Chat" [ref=e27] [cursor=pointer]:
- /url: /
- generic [ref=e28]: Chat
- link "Kaart" [ref=e29] [cursor=pointer]:
- /url: /map
- generic [ref=e30]: Kaart
- link "Verkennen" [ref=e31] [cursor=pointer]:
- /url: /browse
- generic [ref=e32]: Verkennen
- link "Statistieken" [ref=e33] [cursor=pointer]:
- /url: /stats
- generic [ref=e34]: Statistieken
- link "Ontologie" [ref=e35] [cursor=pointer]:
- /url: /ontology
- generic [ref=e36]: Ontologie
- link "Regels" [ref=e37] [cursor=pointer]:
- /url: /rules
- generic [ref=e38]: Regels
- generic [ref=e39]:
- paragraph [ref=e40]: test@nationaalarchief.nl
- button "Wachtwoord" [ref=e41] [cursor=pointer]:
- img [ref=e43]
- text: Wachtwoord
- button "Uitloggen" [ref=e45] [cursor=pointer]:
- img [ref=e47]
- text: Uitloggen
- main [ref=e49]:
- generic [ref=e50]:
- generic [ref=e52]:
- generic [ref=e54]:
- generic [ref=e55]:
- img [ref=e57]
- generic [ref=e59]: U
- paragraph [ref=e60]: Hoeveel musea zijn er in Amsterdam?
- generic [ref=e62]:
- generic [ref=e63]:
- img "de Aa" [ref=e65]
- generic [ref=e66]: de Aa
- generic "gedeeld semantisch match 93% (385ms)" [ref=e67]:
- img [ref=e68]
- generic [ref=e70]: Gecached
- paragraph [ref=e71]: Er zijn 10 musea in Noord-Holland.
- generic [ref=e73] [cursor=pointer]:
- generic [ref=e74]: 10 instellingen gevonden
- img [ref=e75]
- generic [ref=e77]:
- generic [ref=e79]: sparql
- generic [ref=e81]: qdrant
- generic [ref=e84] [cursor=pointer]:
- generic [ref=e85]:
- img [ref=e86]
- heading "SPARQL Kennisgraaf Query" [level=6] [ref=e88]
- generic "Query is geldig volgens LSP" [ref=e89]:
- generic [ref=e90]: ✓ geldig
- button [ref=e91]:
- img [ref=e92]
- generic [ref=e95]:
- generic [ref=e96]:
- generic [ref=e97]:
- generic "Cache statistieken" [ref=e98]:
- img [ref=e99]
- generic [ref=e101]: 100% hit rate (1/1)
- button "Cache wissen" [ref=e102] [cursor=pointer]:
- img [ref=e103]
- button "Debug paneel tonen" [ref=e105] [cursor=pointer]:
- img [ref=e106]
- generic "Selecteer AI-model" [ref=e110]:
- combobox [ref=e111] [cursor=pointer]:
- generic [ref=e112]:
- img [ref=e113]
- paragraph [ref=e116]: Claude Haiku 4.5
- generic [ref=e117]: 💎
- textbox: claude-haiku-4-5-20251001
- img
- group
- generic [ref=e118]:
- generic [ref=e120]:
- textbox "Stel uw vraag over archieven, musea of bibliotheken..." [ref=e121]
- group
- button [disabled]:
- img
- generic [ref=e122]: Aangedreven door DSPy + Qdrant + Oxigraph • Semantische cache ingeschakeld
- button "Toon footer" [ref=e123] [cursor=pointer]:
- img [ref=e124]
- generic [ref=e127]:
- generic [ref=e128]:
- generic [ref=e129]:
- generic [ref=e130]:
- img "de Aa" [ref=e131]
- generic [ref=e132]:
- heading "de Aa" [level=6] [ref=e133]
- paragraph [ref=e134]: Archiefassistent
- paragraph [ref=e135]: Uw digitale helper voor archiefonderzoek en erfgoedvragen, aangedreven door het Nationaal Archief.
- generic [ref=e136]:
- heading "Contact" [level=6] [ref=e137]
- paragraph [ref=e138]:
- text: Nationaal Archief
- text: Prins Willem-Alexanderhof 20
- text: 2595 BE Den Haag
- link "070 - 331 54 00" [ref=e139] [cursor=pointer]:
- /url: tel:+31703315400
- generic [ref=e140]:
- heading "Links" [level=6] [ref=e141]
- generic [ref=e142]:
- link "nationaalarchief.nl" [ref=e143] [cursor=pointer]:
- /url: https://www.nationaalarchief.nl
- link "Archieven.nl" [ref=e144] [cursor=pointer]:
- /url: https://www.archieven.nl
- link "Gahetna.nl" [ref=e145] [cursor=pointer]:
- /url: https://www.gahetna.nl
- paragraph [ref=e147]: © 2026 Nationaal Archief. Alle rechten voorbehouden.
```

View file

@ -1,10 +1,10 @@
{
"ppid": "ID_NL-NH-AMS_197X_NL-GE-OTT_XXXX_BENNO-TEMPEL",
"ppid": "ID_NL-GE-HAR_1972_NL-GE-OTT_XXXX_BENNO-TEMPEL",
"ppid_type": "ID",
"ppid_components": {
"type": "ID",
"first_location": "NL-NH-AMS",
"first_date": "197X",
"first_location": "NL-GE-HAR",
"first_date": "1972",
"last_location": "NL-GE-OTT",
"last_date": "XXXX",
"name_tokens": [
@ -12,11 +12,8 @@
"TEMPEL"
],
"last_location_source": "inferred_current_settlement",
"first_date_source": "inferred_birth_decade.primary_value",
"first_date_alternatives": [
"196X"
],
"first_location_source": "inferred_birth_settlement"
"first_date_source": "web_claim_birth_year",
"first_location_source": "web_claim_birth_place"
},
"name": {
"full_name": "Benno Tempel",
@ -29,9 +26,9 @@
"source": "linkedin_profile"
},
"birth_date": {
"edtf": "XXXX",
"precision": "unknown",
"note": "See inferred_birth_decade for heuristic estimate"
"edtf": "1972",
"precision": "year",
"note": "Verified from Writers Unlimited and Kröller-Müller Museum official sources"
},
"is_living": true,
"heritage_relevance": {
@ -202,7 +199,137 @@
}
]
},
"web_claims": [],
"web_claims": [
{
"claim_type": "birth_year",
"claim_value": "1972",
"source_url": "https://www.writersunlimited.nl/en/participant/benno-tempel",
"retrieved_on": "2025-01-10T12:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "(Harderwijk, 1972) is an art historian and director of the Municipal Museum in The Hague.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T12:00:00Z"
},
"provenance": {
"statement_created_at": "2025-01-10T12:15:00Z",
"source_archived_at": "2025-01-10T12:00:00Z"
}
},
{
"claim_type": "birth_year",
"claim_value": "1972",
"source_url": "https://krollermuller.nl/en/benno-tempel-new-general-director-of-the-kroller-muller-museum",
"retrieved_on": "2025-01-10T12:05:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Benno Tempel (1972) is an art historian and has been director of Kunstmuseum Den Haag (including Fotomuseum Den Haag, KM21 and Escher in Het Paleis) since 2009.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T12:05:00Z"
},
"provenance": {
"statement_created_at": "2025-01-10T12:15:00Z",
"source_archived_at": "2025-01-10T12:05:00Z"
}
},
{
"claim_type": "birth_place",
"claim_value": "Harderwijk",
"source_url": "https://www.writersunlimited.nl/en/participant/benno-tempel",
"retrieved_on": "2025-01-10T12:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "(Harderwijk, 1972) is an art historian and director of the Municipal Museum in The Hague.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T12:00:00Z"
},
"provenance": {
"statement_created_at": "2025-01-10T12:15:00Z",
"source_archived_at": "2025-01-10T12:00:00Z"
}
},
{
"claim_type": "position",
"claim_value": "General Director, Kröller-Müller Museum (November 2023 - present)",
"source_url": "https://krollermuller.nl/en/benno-tempel-new-general-director-of-the-kroller-muller-museum",
"retrieved_on": "2025-01-10T12:05:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "The board of the Kröller-Müller Museum has appointed Benno Tempel (1972) as new general director as of 1 November 2023.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T12:05:00Z"
},
"provenance": {
"statement_created_at": "2025-01-10T12:15:00Z",
"source_archived_at": "2025-01-10T12:05:00Z"
}
},
{
"claim_type": "position",
"claim_value": "Director, Kunstmuseum Den Haag (2009-2023)",
"source_url": "https://krollermuller.nl/en/benno-tempel-new-general-director-of-the-kroller-muller-museum",
"retrieved_on": "2025-01-10T12:05:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Benno Tempel (1972) is an art historian and has been director of Kunstmuseum Den Haag (including Fotomuseum Den Haag, KM21 and Escher in Het Paleis) since 2009.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T12:05:00Z"
},
"provenance": {
"statement_created_at": "2025-01-10T12:15:00Z",
"source_archived_at": "2025-01-10T12:05:00Z"
}
},
{
"claim_type": "achievement",
"claim_value": "Curator of Dutch entry at 58th Venice Biennale 2019",
"source_url": "https://krollermuller.nl/en/benno-tempel-new-general-director-of-the-kroller-muller-museum",
"retrieved_on": "2025-01-10T12:05:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "In 2019 he was curator of the Dutch entry at the 58th Venice Biennale with the presentation by Iris Kensmil and Remy Jungerman in the Rietveld Pavilion.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T12:05:00Z"
},
"provenance": {
"statement_created_at": "2025-01-10T12:15:00Z",
"source_archived_at": "2025-01-10T12:05:00Z"
}
},
{
"claim_type": "profile_photo",
"claim_value": "https://krollermuller.nl/media/presspage/benno_tempel3_c_rdepuy__1_.jpg",
"source_url": "https://krollermuller.nl/en/benno-tempel-new-general-director-of-the-kroller-muller-museum",
"retrieved_on": "2025-01-10T12:05:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Photo: Robin de Puy",
"photo_credit": "Robin de Puy",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T12:05:00Z"
},
"provenance": {
"statement_created_at": "2025-01-10T12:15:00Z",
"source_archived_at": "2025-01-10T12:05:00Z"
}
},
{
"claim_type": "profession",
"claim_value": "Art historian",
"source_url": "https://www.writersunlimited.nl/en/participant/benno-tempel",
"retrieved_on": "2025-01-10T12:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "(Harderwijk, 1972) is an art historian and director of the Municipal Museum in The Hague.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T12:00:00Z"
},
"provenance": {
"statement_created_at": "2025-01-10T12:15:00Z",
"source_archived_at": "2025-01-10T12:00:00Z"
}
}
],
"source_observations": [
{
"source_file": "/Users/kempersc/apps/glam/data/custodian/person/entity/bennotempel_20251214T115050Z.json",
@ -212,8 +339,22 @@
],
"enrichment_metadata": {
"birth_date_search": {
"attempted": false,
"notes": "Not yet searched - requires manual enrichment"
"attempted": true,
"searched_on": "2025-01-10T12:00:00Z",
"search_queries": [
"\"Benno Tempel\" born birthday birth year Harderwijk",
"\"Benno Tempel\" Kröller-Müller Museum director biography"
],
"result": "found",
"notes": "Birth year 1972 and birthplace Harderwijk confirmed from Writers Unlimited and Kröller-Müller Museum official press release"
},
"web_enrichment": {
"last_enriched": "2025-01-10T12:15:00Z",
"sources_checked": [
"https://www.writersunlimited.nl/en/participant/benno-tempel",
"https://krollermuller.nl/en/benno-tempel-new-general-director-of-the-kroller-muller-museum"
],
"claims_added": 8
}
},
"provenance": {
@ -222,8 +363,8 @@
"source_files": [
"/Users/kempersc/apps/glam/data/custodian/person/entity/bennotempel_20251214T115050Z.json"
],
"modified_at": "2026-01-09T19:50:58.668694+00:00",
"modified_by": "enrich_ppids.py"
"modified_at": "2025-01-10T12:15:00Z",
"modified_by": "opencode-claude-sonnet-4"
},
"linkedin_slug": "bennotempel",
"ppid_collision_suffix": "bennotempel",
@ -246,71 +387,20 @@
"inferred_birth_decade",
"inferred_birth_settlement"
]
}
],
"inferred_birth_decade": {
"values": [
"196X",
"197X"
],
"edtf": "[196X,197X]",
"edtf_meaning": "one of: 1960s or 1970s",
"precision": "decade_set",
"primary_value": "197X",
"primary_rationale": "1974 is in 197X, but range extends into 196X",
"confidence": "very_low",
"inference_provenance": {
"method": "earliest_experience_heuristic",
"inference_chain": [
{
"step": 1,
"observation": "First job record found (no education data)",
"source_field": "profile_data.experience",
"source_value": {
"company": "Van Gogh Museum",
"title": "Assistant Curator",
"date_range": "1997 - 2000"
}
},
{
"step": 2,
"extraction": "Start year extracted from date_range",
"extracted_value": 1997
},
{
"step": 3,
"assumption": "First job age is approximately 23 (±5 years)",
"rationale": "Assumes first job after typical university completion",
"confidence_impact": "Higher uncertainty; first job age varies ±5 years"
},
{
"step": 4,
"calculation": "1997 - 23 = 1974",
"result": "Estimated birth year: 1974",
"range": "1969-1979 (accounting for ±5 year variance)"
},
{
"step": 5,
"generalization": "Birth year range spans decade boundary",
"input_range": [
1969,
1979
],
"output": [
"196X",
"197X"
],
"edtf": "[196X,197X]",
"rationale": "Cannot determine which decade with certainty; using EDTF 'one of' set notation"
}
},
{
"previous_ppid": "ID_NL-NH-AMS_197X_NL-GE-OTT_XXXX_BENNO-TEMPEL",
"new_ppid": "ID_NL-GE-HAR_1972_NL-GE-OTT_XXXX_BENNO-TEMPEL",
"changed_at": "2025-01-10T12:15:00Z",
"reason": "web_claim_verification",
"verified_fields": [
"birth_year",
"birth_place"
],
"assumptions": [
"Entry age for education/first job: 23 years (±5)",
"Career records are complete in LinkedIn profile"
],
"boundary_note": "Birth year estimate 1974 spans decades 196X/197X",
"inferred_at": "2026-01-09T19:50:58.668688+00:00",
"inferred_by": "enrich_ppids.py"
"sources": [
"https://www.writersunlimited.nl/en/participant/benno-tempel",
"https://krollermuller.nl/en/benno-tempel-new-general-director-of-the-kroller-muller-museum"
]
}
}
}
]
}

View file

@ -28,7 +28,15 @@
"birth_date": {
"edtf": "1982",
"precision": "year",
"note": "Derived from '(41 jaar)' stated in February 2024 Gelders Archief announcement"
"derivation": {
"method": "age_calculation",
"source_url": "https://www.geldersarchief.nl/over-ons/actueel/nieuws/922-per-1-mei-nieuwe-directeur-gelders-archief",
"source_text": "Petra Links (41 jaar) wordt per 1 mei de nieuwe directeur van het Gelders Archief.",
"source_date": "2024-02",
"calculation": "Age 41 stated in February 2024 announcement implies birth year 1982 or early 1983. Most likely 1982.",
"retrieved_on": "2025-01-10T04:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4"
}
},
"is_living": true,
"heritage_relevance": {
@ -319,6 +327,104 @@
"status": "verified",
"last_verified": "2025-01-10T04:00:00Z"
}
},
{
"claim_type": "authored_work",
"claim_value": "Sustainable Digital Publishing of Archival Catalogues of Twentieth-Century History Archives",
"source_url": "https://inria.hal.science/hal-01281442v1/document",
"retrieved_on": "2025-01-10T06:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Sustainable Digital Publishing of Archival Catalogues of Twentieth-Century History Archives. Veerle Vanden Daelen (main author), Jennifer Edmond, Petra Links, Mike Priddy, Linda Reijnhoudt, Václav Tollar and Annelies van Nispen",
"publication_details": {
"type": "working_paper",
"year": "2016",
"publisher": "INRIA / HAL Open Archives",
"co_authors": ["Veerle Vanden Daelen", "Jennifer Edmond", "Mike Priddy", "Linda Reijnhoudt", "Václav Tollar", "Annelies van Nispen"],
"hal_id": "hal-01281442",
"pages": "1-19",
"language": "English",
"open_access": true,
"license": "CC BY"
},
"verification": {
"status": "verified",
"last_verified": "2025-01-10T06:00:00Z"
}
},
{
"claim_type": "authored_work",
"claim_value": "Sustainable Digital Publishing of Archival Catalogues of Twentieth-Century History Archives (KNAW Pure listing)",
"source_url": "https://pure.knaw.nl/portal/en/publications/sustainable-digital-publishing-of-archival-catalogues-of-twentiet",
"retrieved_on": "2025-01-10T06:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Daelen, V. V., Edmond, J., Links, P., Priddy, M., Reijnhoudt, L., Tollar, V., & Nispen, van, A. (2016). Sustainable Digital Publishing of Archival Catalogues of Twentieth-Century History Archives. (pp. 1-19). (HAL). Inria.",
"publication_details": {
"type": "working_paper",
"year": "2016",
"publication_date": "2016-06-13",
"repository": "KNAW Pure Portal",
"publisher": "Inria",
"pages": "1-19",
"series": "HAL",
"language": "English",
"open_access": true,
"license": "CC BY",
"downloads": 102
},
"verification": {
"status": "verified",
"last_verified": "2025-01-10T06:00:00Z"
}
},
{
"claim_type": "authored_work",
"claim_value": "The Missing Voice: Archivists and Infrastructures for Humanities Research",
"source_url": "https://kclpure.kcl.ac.uk/portal/en/publications/the-missing-voice-archivists-and-infrastructures-for-humanities-r/",
"retrieved_on": "2025-01-10T06:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Speck, R., & Links, P. (2013). The Missing Voice: Archivists and Infrastructures for Humanities Research. International Journal of Humanities and Arts Computing, 7(1-2), 128-146.",
"publication_details": {
"type": "journal_article",
"year": "2013",
"publication_date": "2013-10",
"journal": "International Journal of Humanities and Arts Computing",
"volume": "7",
"issue": "1-2",
"pages": "128-146",
"publisher": "Edinburgh University Press",
"co_authors": ["Reto Speck"],
"doi": "10.3366/ijhac.2013.0085",
"repository": "KCL Pure Portal",
"language": "English",
"open_access": true,
"license": "CC BY",
"downloads": 310,
"peer_reviewed": true
},
"verification": {
"status": "verified",
"last_verified": "2025-01-10T06:00:00Z"
}
},
{
"claim_type": "profile_photo",
"claim_value": "Official profile photograph",
"source_url": "https://www.geldersarchief.nl/over-ons/actueel/nieuws/922-per-1-mei-nieuwe-directeur-gelders-archief",
"media_url": "https://media.licdn.com/dms/image/v2/D4E03AQH6AHQFrhaKEw/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1733006063870",
"retrieved_on": "2025-01-10T07:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Petra Links (41 jaar) wordt per 1 mei de nieuwe directeur van het Gelders Archief. Fotograaf: Caro Lenssen.",
"media_details": {
"photographer": "Caro Lenssen",
"source_institution": "Gelders Archief",
"photo_date": "2024-02",
"license": "unknown",
"notes": "Gelders Archief news article credits photographer Caro Lenssen. LinkedIn profile photo URL used as fallback since original image URL not captured from website."
},
"verification": {
"status": "verified",
"last_verified": "2025-01-10T07:00:00Z"
}
}
],
"source_observations": [
@ -328,7 +434,60 @@
"extraction_agent": "claude-sonnet-4-20250514"
}
],
"bibliography": {
"total_publications": 2,
"total_citations": null,
"source": "HAL INRIA, KNAW Pure, KCL Pure repositories",
"major_works": [
{
"title": "Sustainable Digital Publishing of Archival Catalogues of Twentieth-Century History Archives",
"year": "2016",
"type": "article",
"publisher": "HAL Open Archives / INRIA",
"role": "Co-author",
"co_authors": ["Veerle Vanden Daelen", "Jennifer Edmond", "Mike Priddy", "Linda Reijnhoudt", "Václav Tollar", "Annelies van Nispen"],
"open_access": true,
"url": "https://inria.hal.science/hal-01281442v1/document",
"notes": "Research on archival cataloguing standards and digital preservation for 20th-century history archives"
},
{
"title": "The Missing Voice: Archivists and Infrastructures for Humanities Research",
"year": "2013",
"type": "article",
"publisher": "King's College London",
"role": "Co-author",
"co_authors": ["Reto Speck"],
"open_access": true,
"url": "https://kclpure.kcl.ac.uk/portal/en/publications/the-missing-voice-archivists-and-infrastructures-for-humanities-r/",
"notes": "Research on the role of archivists in digital humanities research infrastructures"
}
],
"research_areas": [
"Archival science",
"Digital preservation",
"Holocaust research infrastructure",
"Metadata standards",
"Digital humanities"
],
"academic_profiles": [
{
"platform": "KNAW Pure",
"url": "https://pure.knaw.nl/portal/en/publications/sustainable-digital-publishing-of-archival-catalogues-of-twentiet"
}
]
},
"enrichment_metadata": {
"bibliography_search": {
"attempted": true,
"searched_on": "2025-01-10T05:30:00Z",
"search_queries": [
"\"Petra Links\" publications archivist",
"\"Petra Links\" NIOD archief publications",
"\"Petra Links\" EHRI publications"
],
"result": "found",
"notes": "Found 2 academic publications related to her work in archival science and digital humanities research infrastructure. Publications from her NIOD period (2011-2016) focus on EHRI portal development and archival cataloguing."
},
"birth_date_search": {
"attempted": true,
"searched_on": "2025-01-10T04:00:00Z",
@ -357,7 +516,7 @@
"source_files": [
"/Users/kempersc/apps/glam/data/custodian/person/entity/petralinks_20251214T113100Z.json"
],
"modified_at": "2025-01-10T04:00:00Z",
"modified_at": "2025-01-10T07:00:00Z",
"modified_by": "opencode-claude-sonnet-4"
},
"linkedin_slug": "petralinks",

View file

@ -27,7 +27,15 @@
"birth_date": {
"edtf": "1960",
"precision": "year",
"note": "Derived from '(61)' in March 2022 DANS announcement"
"derivation": {
"method": "age_calculation",
"source_url": "https://dans.knaw.nl/en/news/anja-smit-new-director-dans/",
"source_text": "Anja Smit (61) has been Librarian of Utrecht University and Director of the University Library since 2010.",
"source_date": "2022-03",
"calculation": "Age 61 in March 2022 implies birth year 1960 or early 1961. Most likely 1960.",
"retrieved_on": "2025-01-10T03:30:00Z",
"retrieval_agent": "opencode-claude-sonnet-4"
}
},
"is_living": true,
"heritage_relevance": {
@ -318,6 +326,25 @@
"status": "verified",
"last_verified": "2025-01-10T03:30:00Z"
}
},
{
"claim_type": "profile_photo",
"claim_value": "Official profile photograph",
"source_url": "https://www.cessda.eu/News/CESSDA-Newsitem-nid3903",
"media_url": "https://www.cessda.eu/News/Main-images/1069/image-thumb__1069__newsfront/Anja%20Smit%20news.jpg",
"retrieved_on": "2025-01-10T07:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Hello, my name is Anja Smit and joined DANS, Dutch Centre of Expertise and National Repository and for research data in 2022 as the Director.",
"media_details": {
"photographer": null,
"source_institution": "CESSDA (Consortium of European Social Science Data Archives)",
"photo_date": null,
"license": "unknown"
},
"verification": {
"status": "verified",
"last_verified": "2025-01-10T07:00:00Z"
}
}
],
"source_observations": [
@ -328,6 +355,18 @@
}
],
"enrichment_metadata": {
"bibliography_search": {
"attempted": true,
"searched_on": "2025-01-10T05:30:00Z",
"search_queries": [
"\"Anja Smit\" publications library",
"\"Anja Smit\" Utrecht University Library publications",
"\"Anja Smit\" DANS publications research",
"\"Anja Smit\" LIBER publications"
],
"result": "not_found",
"notes": "No academic publications found. Anja Smit is a library administration professional and institutional leader (University Librarian, DANS Director, LIBER Secretary General, OCLC Board member) rather than an academic researcher/author. Her career focus is on library management, open science policy, and research data infrastructure governance rather than scholarly publishing."
},
"birth_date_search": {
"attempted": true,
"searched_on": "2025-01-10T03:30:00Z",
@ -357,7 +396,7 @@
"source_files": [
"/Users/kempersc/apps/glam/data/custodian/person/entity/anjasmit_20251214T110458Z.json"
],
"modified_at": "2025-01-10T03:30:00Z",
"modified_at": "2025-01-10T07:00:00Z",
"modified_by": "opencode-claude-sonnet-4"
},
"linkedin_slug": "anjasmit",

View file

@ -33,7 +33,14 @@
},
"birth_date": {
"edtf": "1962",
"precision": "year"
"precision": "year",
"derivation": {
"method": "direct_statement",
"source_url": "https://www.amsterdammuseum.nl/en/person/judikje-kiers/2466",
"source_text": "Judikje Kiers (1962) studied art history and architectural history at the Vrije Universiteit Amsterdam",
"retrieved_on": "2025-01-10T02:30:00Z",
"retrieval_agent": "opencode-claude-sonnet-4"
}
},
"is_living": true,
"heritage_relevance": {
@ -41,18 +48,97 @@
"heritage_types": [
"M"
],
"rationale": "Identified as heritage-relevant from LinkedIn search results for Amsterdam Museum. Heritage type: M."
"rationale": "Managing Director of Amsterdam Museum since 2016. Former director of Museum Ons' Lieve Heer op Solder and Bijbels Museum. Art historian specializing in Dutch Golden Age. Author of 'The Golden Age of Dutch Art' (Thames & Hudson)."
},
"affiliations": [
{
"custodian_name": "Amsterdam Museum",
"custodian_slug": null,
"role_title": "Algemeen Directeur bij Amsterdam Museum",
"role_title": "Algemeen Directeur (Managing Director)",
"heritage_relevant": true,
"heritage_type": "M",
"current": true,
"observed_on": "2025-12-14T11:50:55.038087+00:00",
"source": "linkedin_people_search"
"start_date": "2016-03-01",
"observed_on": "2025-01-10T05:30:00Z",
"source": "web_claim"
},
{
"custodian_name": "Museum Ons' Lieve Heer op Solder",
"custodian_slug": null,
"role_title": "Director",
"heritage_relevant": true,
"heritage_type": "M",
"current": false,
"start_date": "2001",
"end_date": "2016",
"observed_on": "2025-01-10T05:30:00Z",
"source": "web_claim",
"notes": "Museum was restored and expanded under her leadership"
},
{
"custodian_name": "Bijbels Museum",
"custodian_slug": null,
"role_title": "Director",
"heritage_relevant": true,
"heritage_type": "M",
"current": false,
"start_date": "2009",
"end_date": "2016",
"observed_on": "2025-01-10T05:30:00Z",
"source": "web_claim",
"notes": "Combined with Museum Ons' Lieve Heer op Solder directorship"
},
{
"custodian_name": "Cromhouthuizen",
"custodian_slug": null,
"role_title": "Director",
"heritage_relevant": true,
"heritage_type": "M",
"current": false,
"start_date": "2009",
"end_date": "2016",
"observed_on": "2025-01-10T05:30:00Z",
"source": "web_claim"
},
{
"custodian_name": "Rijksmuseum",
"custodian_slug": null,
"role_title": "Staff position",
"heritage_relevant": true,
"heritage_type": "M",
"current": false,
"observed_on": "2025-01-10T05:30:00Z",
"source": "web_claim"
},
{
"custodian_name": "Frans Hals Museum",
"custodian_slug": null,
"role_title": "Career start position",
"heritage_relevant": true,
"heritage_type": "M",
"current": false,
"observed_on": "2025-01-10T05:30:00Z",
"source": "web_claim"
},
{
"custodian_name": "Rietveld Academie",
"custodian_slug": null,
"role_title": "Lecturer",
"heritage_relevant": true,
"heritage_type": "E",
"current": false,
"observed_on": "2025-01-10T05:30:00Z",
"source": "web_claim"
},
{
"custodian_name": "Reinwardt Academie",
"custodian_slug": null,
"role_title": "Lecturer",
"heritage_relevant": true,
"heritage_type": "E",
"current": false,
"observed_on": "2025-01-10T05:30:00Z",
"source": "web_claim"
}
],
"profile_data": {
@ -62,7 +148,13 @@
"location": null,
"about": null,
"experience": [],
"education": [],
"education": [
{
"degree": "Art History and Architectural History",
"institution": "Vrije Universiteit Amsterdam",
"date_range": null
}
],
"skills": [],
"languages": []
},
@ -78,8 +170,147 @@
"status": "verified",
"last_verified": "2025-01-10T02:30:00Z"
}
},
{
"claim_type": "education",
"claim_value": "Art history and architectural history at Vrije Universiteit Amsterdam",
"source_url": "https://www.amsterdammuseum.nl/en/person/judikje-kiers/2466",
"retrieved_on": "2025-01-10T05:30:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Judikje Kiers (1962) studied art history and architectural history at the Vrije Universiteit Amsterdam.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:30:00Z"
}
},
{
"claim_type": "career_history",
"claim_value": "Career started at Frans Hals Museum, then worked at Rijksmuseum",
"source_url": "https://www.amsterdammuseum.nl/en/person/judikje-kiers/2466",
"retrieved_on": "2025-01-10T05:30:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Kiers began her career at the Frans Hals Museum, after which she worked for the Rijksmuseum.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:30:00Z"
}
},
{
"claim_type": "position",
"claim_value": "Managing Director of Amsterdam Museum since March 1, 2016",
"source_url": "https://www.amsterdammuseum.nl/en/person/judikje-kiers/2466",
"retrieved_on": "2025-01-10T05:30:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Since March 1, 2016, Judikje Kiers has served as managing director of the Amsterdam Museum.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:30:00Z"
}
},
{
"claim_type": "position",
"claim_value": "Director of Museum Ons' Lieve Heer op Solder from 2001",
"source_url": "https://www.amsterdammuseum.nl/en/person/judikje-kiers/2466",
"retrieved_on": "2025-01-10T05:30:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "In 2001 she was appointed director of Museum Ons' Lieve Heer op Solder, which was restored and expanded under her leadership.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:30:00Z"
}
},
{
"claim_type": "position",
"claim_value": "Combined directorship of Bijbels Museum and Cromhouthuizen from 2009",
"source_url": "https://www.amsterdammuseum.nl/en/person/judikje-kiers/2466",
"retrieved_on": "2025-01-10T05:30:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "From 2009 onward, she combined that position with a directorship at the Bijbels Museum and the Cromhouthuizen.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:30:00Z"
}
},
{
"claim_type": "authored_work",
"claim_value": "The Golden Age of Dutch Art: Painting, Sculpture, Decorative Art",
"source_url": "https://www.abebooks.co.uk/9780500237748/Golden-Age-Dutch-Art-Painting-0500237743/plp",
"retrieved_on": "2025-01-10T05:30:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Kiers, Judikje; Tissink, Fieke - The Golden Age of Dutch Art: Painting, Sculpture, Decorative Art",
"publication_details": {
"type": "book",
"year": "2000",
"publisher": "Thames & Hudson",
"co_authors": ["Fieke Tissink"],
"isbn": "9780500237748",
"language": "English",
"format": "Hardcover"
},
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:30:00Z"
}
},
{
"claim_type": "authored_work_review",
"claim_value": "The Golden Age of Dutch Art received positive reviews for quality of content and presentation",
"source_url": "https://www.amazon.com/Golden-Age-Dutch-Art-Decorative/dp/0500237743",
"retrieved_on": "2025-01-10T05:30:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Paintings over the decades are covered and some ceramics, tapestries, busts, and decorative arts. The description of the paintings is quite good and details specifics for you to look at and learn from, including symbolism and hidden meaning.",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:30:00Z"
}
},
{
"claim_type": "profile_photo",
"claim_value": "Official profile photograph",
"source_url": "https://www.amsterdammuseum.nl/en/person/judikje-kiers/2466",
"media_url": "https://assets.amsterdammuseum.nl/images/transforms/_82xAUTO_crop_center-center_35_none/Judikje-Kiers-Foto-Daphne-Lucker-Amsterdam-Museum-1753810129.jpeg",
"retrieved_on": "2025-01-10T07:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Since March 1, 2016, Judikje Kiers has served as managing director of the Amsterdam Museum. Judikje Kiers (1962) studied art history and architectural history at the Vrije Universiteit Amsterdam.",
"media_details": {
"photographer": "Daphne Lucker",
"source_institution": "Amsterdam Museum",
"photo_date": null,
"license": "unknown"
},
"verification": {
"status": "verified",
"last_verified": "2025-01-10T07:00:00Z"
}
}
],
"bibliography": {
"total_publications": 1,
"major_works": [
{
"title": "The Golden Age of Dutch Art: Painting, Sculpture, Decorative Art",
"year": "2000",
"type": "book",
"publisher": "Thames & Hudson",
"role": "Co-author",
"co_authors": ["Fieke Tissink"],
"isbn": "9780500237748",
"description": "Comprehensive survey of Dutch Golden Age art covering paintings, ceramics, tapestries, busts, and decorative arts. Includes analysis of symbolism and hidden meanings in artworks.",
"available_at": [
{
"library": "San Francisco Public Library",
"catalog_url": "https://sfpl.bibliocommons.com/v2/record/S93C1727933"
}
]
}
],
"research_areas": [
"Dutch Golden Age art",
"Art history",
"Architectural history",
"Museum management"
]
},
"source_observations": [
{
"source_file": "/Users/kempersc/apps/glam/data/custodian/person/entity/judikje_20251214T115050Z.json",
@ -96,6 +327,17 @@
],
"result": "found",
"notes": "Birth year 1962 found on Amsterdam Museum website person page."
},
"bibliography_search": {
"attempted": true,
"searched_on": "2025-01-10T05:30:00Z",
"search_queries": [
"\"Judikje Kiers\" author publication art history museum book",
"site:worldcat.org \"Judikje Kiers\""
],
"result": "found",
"sources_found": 4,
"notes": "Major publication 'The Golden Age of Dutch Art' (2000) with Fieke Tissink found. Book is a scholarly reference work on Dutch Golden Age art."
}
},
"provenance": {
@ -103,7 +345,9 @@
"created_by": "generate_ppids.py",
"source_files": [
"/Users/kempersc/apps/glam/data/custodian/person/entity/judikje_20251214T115050Z.json"
]
],
"modified_at": "2025-01-10T07:00:00Z",
"modified_by": "opencode-claude-sonnet-4"
},
"linkedin_slug": "judikje"
}

View file

@ -33,26 +33,57 @@
},
"birth_date": {
"edtf": "1967",
"precision": "year"
"precision": "year",
"derivation": {
"method": "direct_statement",
"source_url": "https://rug.nl/about-ug/latest-news/news/archief2021/nieuwsberichten/martijn-eickhoff-nieuwe-directeur-niod",
"source_text": "Eickhoff (1967) has been a senior researcher at the NIOD since 2006",
"retrieved_on": "2025-01-10T02:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4"
}
},
"is_living": true,
"heritage_relevance": {
"is_heritage_relevant": true,
"heritage_types": [
"A"
"A",
"R"
],
"rationale": "Identified as heritage-relevant from LinkedIn search results for NIOD Institute for War, Holocaust and Genocide Studies. Heritage type: A."
"rationale": "Director of NIOD Institute for War, Holocaust and Genocide Studies. Prolific academic author in archaeology, heritage studies, and WWII history. Professor by Special Appointment at University of Groningen."
},
"affiliations": [
{
"custodian_name": "NIOD Institute for War, Holocaust and Genocide Studies",
"custodian_slug": null,
"role_title": "Director at NIOD Institute for War, Holocaust and Genocide Studies",
"role_title": "Director",
"heritage_relevant": true,
"heritage_type": "A",
"current": true,
"observed_on": "2025-12-14T11:50:52.771351+00:00",
"source": "linkedin_people_search"
"start_date": "2021-10-01",
"observed_on": "2025-01-10T05:00:00Z",
"source": "web_claim"
},
{
"custodian_name": "University of Groningen",
"custodian_slug": null,
"role_title": "Professor by Special Appointment in Archaeology and Heritage of War and Mass Violence",
"heritage_relevant": true,
"heritage_type": "E",
"current": true,
"observed_on": "2025-01-10T05:00:00Z",
"source": "web_claim",
"notes": "On behalf of KNAW/NIOD"
},
{
"custodian_name": "Royal Netherlands Academy of Arts and Sciences (KNAW)",
"custodian_slug": null,
"role_title": "Senior Researcher",
"heritage_relevant": true,
"heritage_type": "R",
"current": true,
"start_date": "2006",
"observed_on": "2025-01-10T05:00:00Z",
"source": "web_claim"
}
],
"profile_data": {
@ -78,8 +109,213 @@
"status": "verified",
"last_verified": "2025-01-10T02:00:00Z"
}
},
{
"claim_type": "position",
"claim_value": "Professor by Special Appointment in Archaeology and Heritage of War and Mass Violence at University of Groningen",
"source_url": "https://www.rug.nl/staff/m.eickhoff/?lang=en",
"retrieved_on": "2025-01-10T05:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Professor by Special Appointment in Archaeology and Heritage of War and Mass Violence, on behalf of KNAW/NIOD",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:00:00Z"
}
},
{
"claim_type": "authored_work",
"claim_value": "National-Socialist Archaeology in Europe and its Legacies (Editor)",
"source_url": "https://link.springer.com/book/10.1007/978-3-031-28024-5",
"retrieved_on": "2025-01-10T05:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Editors: Martijn Eickhoff, Daniel Modl",
"publication_details": {
"type": "edited_volume",
"year": "2023",
"publisher": "Springer",
"co_editors": ["Daniel Modl"],
"isbn": "978-3-031-28024-5",
"language": "English"
},
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:00:00Z"
}
},
{
"claim_type": "authored_work",
"claim_value": "The Politics of Heritage in Indonesia: A Cultural History (Co-author)",
"source_url": "https://pure.knaw.nl/portal/en/publications/the-politics-of-heritage-in-indonesia-a-cultural-history/",
"retrieved_on": "2025-01-10T05:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Martijn Eickhoff, M. Bloembergen",
"publication_details": {
"type": "book",
"year": "2020",
"publisher": "Cambridge University Press",
"co_authors": ["Marieke Bloembergen"],
"language": "English"
},
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:00:00Z"
}
},
{
"claim_type": "authored_work",
"claim_value": "Revolutionary Worlds: Local Perspectives and Dynamics during the Indonesian Independence War, 1945-1949 (Editor)",
"source_url": "https://www.aup.nl/en/book/9789048556861/revolutionary-worlds",
"retrieved_on": "2025-01-10T05:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Editors: Bambang Purwanto et al.",
"publication_details": {
"type": "edited_volume",
"year": "2023",
"publisher": "Amsterdam University Press",
"series": "Onafhankelijkheid, Dekolonisatie, Geweld en Oorlog in Indonesie 1945-1950",
"isbn": "9789048556861",
"language": "English"
},
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:00:00Z"
}
},
{
"claim_type": "authored_work",
"claim_value": "Beyond the Pale: Dutch Extreme Violence in the Indonesian War of Independence, 1945-1949 (Contributor)",
"source_url": "https://library.oapen.org/handle/20.500.12657/53173",
"retrieved_on": "2025-01-10T05:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Nederlands Instituut voor Militaire Historie (NIMH)",
"publication_details": {
"type": "book_chapter",
"year": "2022",
"publisher": "Amsterdam University Press",
"series": "Onafhankelijkheid, Dekolonisatie, Geweld en Oorlog in Indonesie 1945-1950",
"isbn": "9789048557172",
"language": "English",
"open_access": true
},
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:00:00Z"
}
},
{
"claim_type": "academic_profile",
"claim_value": "Academia.edu profile with multiple publications",
"source_url": "https://knaw.academia.edu/MartijnEickhoff/Books",
"retrieved_on": "2025-01-10T05:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Martijn Eickhoff - Royal Netherlands Academy of Arts and Sciences",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:00:00Z"
}
},
{
"claim_type": "academic_profile",
"claim_value": "SciSpace profile: 28 publications, 180 citations",
"source_url": "https://scispace.com/authors/martijn-eickhoff-3vdelia683",
"retrieved_on": "2025-01-10T05:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Martijn Eickhoff | NIOD Institute for War, Holocaust and Genocide Studies | 28 Publications | 180 Citations",
"verification": {
"status": "verified",
"last_verified": "2025-01-10T05:00:00Z"
}
},
{
"claim_type": "profile_photo",
"claim_value": "Official profile photograph",
"source_url": "https://www.niod.nl/en/staff/martijn-eickhoff",
"media_url": "https://d3mb4k8bvt6xe4.cloudfront.net/styles/150w/s3/2025-06/NIOD_May2025_Robin-Alysha-Clemens_web-11.jpg?itok=TlgmjHRj",
"retrieved_on": "2025-01-10T07:00:00Z",
"retrieval_agent": "opencode-claude-sonnet-4",
"text_fragment": "Martijn Eickhoff is director of NIOD Institute for War, Holocaust and Genocide Studies and endowed professor of Archaeology and Heritage of War and Mass Violence at the University of Groningen.",
"media_details": {
"photographer": "Robin Alysha Clemens",
"source_institution": "NIOD Institute for War, Holocaust and Genocide Studies",
"photo_date": "May 2025",
"license": "unknown"
},
"alternative_photos": [
{
"media_url": "https://www.rug.nl/staff/m.eickhoff/photo.png?unique=1600960959032.jpg",
"source_url": "https://www.rug.nl/staff/m.eickhoff/?lang=en",
"source_institution": "University of Groningen"
}
],
"verification": {
"status": "verified",
"last_verified": "2025-01-10T07:00:00Z"
}
}
],
"bibliography": {
"total_publications": 28,
"total_citations": 180,
"source": "SciSpace profile",
"major_works": [
{
"title": "National-Socialist Archaeology in Europe and its Legacies",
"year": "2023",
"type": "edited_volume",
"publisher": "Springer",
"role": "Editor"
},
{
"title": "The Politics of Heritage in Indonesia: A Cultural History",
"year": "2020",
"type": "book",
"publisher": "Cambridge University Press",
"role": "Co-author",
"co_authors": ["Marieke Bloembergen"]
},
{
"title": "Revolutionary Worlds: Local Perspectives and Dynamics during the Indonesian Independence War, 1945-1949",
"year": "2023",
"type": "edited_volume",
"publisher": "Amsterdam University Press",
"role": "Editor"
},
{
"title": "Beyond the Pale: Dutch Extreme Violence in the Indonesian War of Independence, 1945-1949",
"year": "2022",
"type": "book_chapter",
"publisher": "Amsterdam University Press",
"role": "Contributor",
"open_access": true
}
],
"research_areas": [
"Nazi archaeology",
"Heritage studies",
"War and mass violence",
"Indonesian independence war",
"Dutch colonial history",
"Holocaust studies"
],
"academic_profiles": [
{
"platform": "Academia.edu",
"url": "https://knaw.academia.edu/MartijnEickhoff"
},
{
"platform": "SciSpace",
"url": "https://scispace.com/authors/martijn-eickhoff-3vdelia683"
},
{
"platform": "KNAW Pure",
"url": "https://pure.knaw.nl/portal/en/persons/martijn-eickhoff-2/"
},
{
"platform": "University of Groningen Research Portal",
"url": "https://research.rug.nl/en/persons/m-eickhoff"
}
]
},
"source_observations": [
{
"source_file": "/Users/kempersc/apps/glam/data/custodian/person/entity/martijn-eickhoff-03972635_20251214T115050Z.json",
@ -97,6 +333,17 @@
],
"result": "found",
"notes": "Birth year 1967 found in University of Groningen news announcement about Eickhoff appointment as NIOD director."
},
"bibliography_search": {
"attempted": true,
"searched_on": "2025-01-10T05:00:00Z",
"search_queries": [
"\"Martijn Eickhoff\" author publication NIOD history book",
"site:worldcat.org \"Martijn Eickhoff\""
],
"result": "found",
"sources_found": 6,
"notes": "Extensive academic publication record found. Major works in archaeology, heritage studies, and Dutch colonial/WWII history. 28 publications with 180 citations per SciSpace."
}
},
"provenance": {
@ -104,7 +351,9 @@
"created_by": "generate_ppids.py",
"source_files": [
"/Users/kempersc/apps/glam/data/custodian/person/entity/martijn-eickhoff-03972635_20251214T115050Z.json"
]
],
"modified_at": "2025-01-10T07:00:00Z",
"modified_by": "opencode-claude-sonnet-4"
},
"linkedin_slug": "martijn-eickhoff-03972635"
}

512
node_modules/.modules.yaml generated vendored
View file

@ -3,10 +3,6 @@ hoistPattern:
hoistedDependencies:
'@acemir/cssom@0.9.30':
'@acemir/cssom': private
'@adobe/css-tools@4.4.4':
'@adobe/css-tools': private
'@antfu/install-pkg@1.1.0':
'@antfu/install-pkg': private
'@asamuzakjp/css-color@4.1.1':
'@asamuzakjp/css-color': private
'@asamuzakjp/dom-selector@6.7.6':
@ -53,36 +49,6 @@ hoistedDependencies:
'@babel/traverse': private
'@babel/types@7.28.5':
'@babel/types': private
'@braintree/sanitize-url@7.1.1':
'@braintree/sanitize-url': private
'@chevrotain/cst-dts-gen@11.0.3':
'@chevrotain/cst-dts-gen': private
'@chevrotain/gast@11.0.3':
'@chevrotain/gast': private
'@chevrotain/regexp-to-ast@11.0.3':
'@chevrotain/regexp-to-ast': private
'@chevrotain/types@11.0.3':
'@chevrotain/types': private
'@chevrotain/utils@11.0.3':
'@chevrotain/utils': private
'@codemirror/autocomplete@6.20.0':
'@codemirror/autocomplete': private
'@codemirror/commands@6.10.1':
'@codemirror/commands': private
'@codemirror/lang-javascript@6.2.4':
'@codemirror/lang-javascript': private
'@codemirror/language@6.12.1':
'@codemirror/language': private
'@codemirror/lint@6.9.2':
'@codemirror/lint': private
'@codemirror/search@6.5.11':
'@codemirror/search': private
'@codemirror/state@6.5.3':
'@codemirror/state': private
'@codemirror/theme-one-dark@6.1.3':
'@codemirror/theme-one-dark': private
'@codemirror/view@6.39.9':
'@codemirror/view': private
'@csstools/color-helpers@5.1.0':
'@csstools/color-helpers': private
'@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
@ -95,10 +61,6 @@ hoistedDependencies:
'@csstools/css-syntax-patches-for-csstree': private
'@csstools/css-tokenizer@3.0.4':
'@csstools/css-tokenizer': private
'@dimforge/rapier3d-compat@0.12.0':
'@dimforge/rapier3d-compat': private
'@duckdb/duckdb-wasm@1.32.0':
'@duckdb/duckdb-wasm': private
'@emotion/babel-plugin@11.13.5':
'@emotion/babel-plugin': private
'@emotion/cache@11.14.0':
@ -177,38 +139,8 @@ hoistedDependencies:
'@esbuild/win32-ia32': private
'@esbuild/win32-x64@0.25.12':
'@esbuild/win32-x64': private
'@eslint-community/eslint-utils@4.9.1(eslint@9.39.2)':
'@eslint-community/eslint-utils': public
'@eslint-community/regexpp@4.12.2':
'@eslint-community/regexpp': public
'@eslint/config-array@0.21.1':
'@eslint/config-array': public
'@eslint/config-helpers@0.4.2':
'@eslint/config-helpers': public
'@eslint/core@0.17.0':
'@eslint/core': public
'@eslint/eslintrc@3.3.3':
'@eslint/eslintrc': public
'@eslint/js@9.39.2':
'@eslint/js': public
'@eslint/object-schema@2.1.7':
'@eslint/object-schema': public
'@eslint/plugin-kit@0.4.1':
'@eslint/plugin-kit': public
'@exodus/bytes@1.8.0':
'@exodus/bytes': private
'@humanfs/core@0.19.1':
'@humanfs/core': private
'@humanfs/node@0.16.7':
'@humanfs/node': private
'@humanwhocodes/module-importer@1.0.1':
'@humanwhocodes/module-importer': private
'@humanwhocodes/retry@0.4.3':
'@humanwhocodes/retry': private
'@iconify/types@2.0.0':
'@iconify/types': private
'@iconify/utils@3.1.0':
'@iconify/utils': private
'@jridgewell/gen-mapping@0.3.13':
'@jridgewell/gen-mapping': private
'@jridgewell/remapping@2.3.5':
@ -219,14 +151,6 @@ hoistedDependencies:
'@jridgewell/sourcemap-codec': private
'@jridgewell/trace-mapping@0.3.31':
'@jridgewell/trace-mapping': private
'@lezer/common@1.5.0':
'@lezer/common': private
'@lezer/highlight@1.2.3':
'@lezer/highlight': private
'@lezer/javascript@1.5.4':
'@lezer/javascript': private
'@lezer/lr@1.4.7':
'@lezer/lr': private
'@mapbox/geojson-rewind@0.5.2':
'@mapbox/geojson-rewind': private
'@mapbox/jsonlint-lines-primitives@2.0.2':
@ -247,10 +171,6 @@ hoistedDependencies:
'@maplibre/mlt': private
'@maplibre/vt-pbf@4.2.0':
'@maplibre/vt-pbf': private
'@marijn/find-cluster-break@1.0.2':
'@marijn/find-cluster-break': private
'@mermaid-js/parser@0.6.3':
'@mermaid-js/parser': private
'@mui/core-downloads-tracker@7.3.7':
'@mui/core-downloads-tracker': private
'@mui/icons-material@7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react@19.2.3)':
@ -267,8 +187,6 @@ hoistedDependencies:
'@mui/types': private
'@mui/utils@7.3.7(@types/react@19.2.7)(react@19.2.3)':
'@mui/utils': private
'@pkgr/core@0.2.9':
'@pkgr/core': private
'@playwright/test@1.57.0':
'@playwright/test': private
'@polka/url@1.0.0-next.29':
@ -329,24 +247,10 @@ hoistedDependencies:
'@rollup/rollup-win32-x64-msvc': private
'@standard-schema/spec@1.1.0':
'@standard-schema/spec': private
'@swc/helpers@0.5.18':
'@swc/helpers': private
'@tanstack/query-core@5.90.16':
'@tanstack/query-core': private
'@tanstack/react-query@5.90.16(react@19.2.3)':
'@tanstack/react-query': private
'@testing-library/dom@10.4.1':
'@testing-library/dom': private
'@testing-library/jest-dom@6.9.1':
'@testing-library/jest-dom': private
'@testing-library/react@16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
'@testing-library/react': private
'@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)':
'@testing-library/user-event': private
'@tweenjs/tween.js@23.1.3':
'@tweenjs/tween.js': private
'@types/aria-query@5.0.4':
'@types/aria-query': private
'@types/babel__core@7.20.5':
'@types/babel__core': private
'@types/babel__generator@7.27.0':
@ -357,10 +261,6 @@ hoistedDependencies:
'@types/babel__traverse': private
'@types/chai@5.2.3':
'@types/chai': private
'@types/command-line-args@5.2.3':
'@types/command-line-args': private
'@types/command-line-usage@5.0.4':
'@types/command-line-usage': private
'@types/d3-array@3.2.2':
'@types/d3-array': private
'@types/d3-axis@3.0.6':
@ -423,14 +323,10 @@ hoistedDependencies:
'@types/d3-zoom': private
'@types/d3@7.4.3':
'@types/d3': private
'@types/dagre@0.7.53':
'@types/dagre': private
'@types/debug@4.1.12':
'@types/debug': private
'@types/deep-eql@4.0.2':
'@types/deep-eql': private
'@types/dompurify@3.2.0':
'@types/dompurify': private
'@types/estree-jsx@1.0.5':
'@types/estree-jsx': private
'@types/estree@1.0.8':
@ -443,10 +339,6 @@ hoistedDependencies:
'@types/hast': private
'@types/js-yaml@4.0.9':
'@types/js-yaml': private
'@types/json-schema@7.0.15':
'@types/json-schema': private
'@types/lodash@4.17.21':
'@types/lodash': private
'@types/mdast@4.0.4':
'@types/mdast': private
'@types/ms@2.1.0':
@ -463,42 +355,10 @@ hoistedDependencies:
'@types/react-transition-group': private
'@types/react@19.2.7':
'@types/react': private
'@types/stats.js@0.17.4':
'@types/stats.js': private
'@types/supercluster@7.1.3':
'@types/supercluster': private
'@types/three@0.181.0':
'@types/three': private
'@types/trusted-types@2.0.7':
'@types/trusted-types': private
'@types/unist@3.0.3':
'@types/unist': private
'@types/webxr@0.5.24':
'@types/webxr': private
'@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)':
'@typescript-eslint/eslint-plugin': public
'@typescript-eslint/parser@8.52.0(eslint@9.39.2)(typescript@5.9.3)':
'@typescript-eslint/parser': public
'@typescript-eslint/project-service@8.52.0(typescript@5.9.3)':
'@typescript-eslint/project-service': public
'@typescript-eslint/scope-manager@8.52.0':
'@typescript-eslint/scope-manager': public
'@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3)':
'@typescript-eslint/tsconfig-utils': public
'@typescript-eslint/type-utils@8.52.0(eslint@9.39.2)(typescript@5.9.3)':
'@typescript-eslint/type-utils': public
'@typescript-eslint/types@8.52.0':
'@typescript-eslint/types': public
'@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)':
'@typescript-eslint/typescript-estree': public
'@typescript-eslint/utils@8.52.0(eslint@9.39.2)(typescript@5.9.3)':
'@typescript-eslint/utils': public
'@typescript-eslint/visitor-keys@8.52.0':
'@typescript-eslint/visitor-keys': public
'@uiw/codemirror-extensions-basic-setup@4.25.4(@codemirror/autocomplete@6.20.0)(@codemirror/commands@6.10.1)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/view@6.39.9)':
'@uiw/codemirror-extensions-basic-setup': private
'@uiw/react-codemirror@4.25.4(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.9)(codemirror@6.0.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
'@uiw/react-codemirror': private
'@ungap/structured-clone@1.3.0':
'@ungap/structured-clone': private
'@vitejs/plugin-react@5.1.2(vite@6.4.1(@types/node@24.10.4))':
@ -519,58 +379,24 @@ hoistedDependencies:
'@vitest/ui': private
'@vitest/utils@4.0.16':
'@vitest/utils': private
'@webgpu/types@0.1.68':
'@webgpu/types': private
abort-controller@3.0.0:
abort-controller: private
acorn-jsx@5.3.2(acorn@8.15.0):
acorn-jsx: private
acorn@8.15.0:
acorn: private
agent-base@7.1.4:
agent-base: private
ajv@6.12.6:
ajv: private
ansi-regex@5.0.1:
ansi-regex: private
ansi-styles@4.3.0:
ansi-styles: private
apache-arrow@21.1.0:
apache-arrow: private
apps/archief-assistent:
archief-assistent: private
argparse@2.0.1:
argparse: private
aria-query@5.3.2:
aria-query: private
array-back@6.2.2:
array-back: private
assertion-error@2.0.1:
assertion-error: private
asynckit@0.4.0:
asynckit: private
axios@1.13.2:
axios: private
babel-plugin-macros@3.1.0:
babel-plugin-macros: private
bail@2.0.2:
bail: private
balanced-match@1.0.2:
balanced-match: private
base64-js@1.5.1:
base64-js: private
baseline-browser-mapping@2.9.12:
baseline-browser-mapping: private
bidi-js@1.0.3:
bidi-js: private
brace-expansion@1.1.12:
brace-expansion: private
browserslist@4.28.1:
browserslist: private
buffer@6.0.3:
buffer: private
call-bind-apply-helpers@1.0.2:
call-bind-apply-helpers: private
callsites@3.1.0:
callsites: private
caniuse-lite@1.0.30001763:
@ -579,10 +405,6 @@ hoistedDependencies:
ccount: private
chai@6.2.2:
chai: private
chalk-template@0.4.0:
chalk-template: private
chalk@4.1.2:
chalk: private
character-entities-html4@2.1.0:
character-entities-html4: private
character-entities-legacy@3.0.0:
@ -591,58 +413,24 @@ hoistedDependencies:
character-entities: private
character-reference-invalid@2.0.1:
character-reference-invalid: private
chevrotain-allstar@0.3.1(chevrotain@11.0.3):
chevrotain-allstar: private
chevrotain@11.0.3:
chevrotain: private
clsx@2.1.1:
clsx: private
codemirror@6.0.2:
codemirror: private
color-convert@2.0.1:
color-convert: private
color-name@1.1.4:
color-name: private
combined-stream@1.0.8:
combined-stream: private
comma-separated-tokens@2.0.3:
comma-separated-tokens: private
command-line-args@6.0.1:
command-line-args: private
command-line-usage@7.0.3:
command-line-usage: private
commander@7.2.0:
commander: private
concat-map@0.0.1:
concat-map: private
confbox@0.1.8:
confbox: private
convert-source-map@2.0.0:
convert-source-map: private
cookie@1.1.1:
cookie: private
cose-base@1.0.3:
cose-base: private
cosmiconfig@7.1.0:
cosmiconfig: private
crelt@1.0.6:
crelt: private
cross-spawn@7.0.6:
cross-spawn: private
css-tree@3.1.0:
css-tree: private
css.escape@1.5.1:
css.escape: private
cssstyle@5.3.7:
cssstyle: private
csstype@3.2.3:
csstype: private
cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1):
cytoscape-cose-bilkent: private
cytoscape-fcose@2.2.0(cytoscape@3.33.1):
cytoscape-fcose: private
cytoscape@3.33.1:
cytoscape: private
d3-array@3.2.4:
d3-array: private
d3-axis@3.0.0:
@ -685,8 +473,6 @@ hoistedDependencies:
d3-quadtree: private
d3-random@3.0.1:
d3-random: private
d3-sankey@0.12.3:
d3-sankey: private
d3-scale-chromatic@3.1.0:
d3-scale-chromatic: private
d3-scale@4.0.2:
@ -707,132 +493,54 @@ hoistedDependencies:
d3-zoom: private
d3@7.9.0:
d3: private
dagre-d3-es@7.0.13:
dagre-d3-es: private
dagre@0.8.5:
dagre: private
data-urls@6.0.0:
data-urls: private
date-fns@4.1.0:
date-fns: private
dayjs@1.11.19:
dayjs: private
debug@4.4.3:
debug: private
decimal.js@10.6.0:
decimal.js: private
decode-named-character-reference@1.2.0:
decode-named-character-reference: private
deep-is@0.1.4:
deep-is: private
delaunator@5.0.1:
delaunator: private
delayed-stream@1.0.0:
delayed-stream: private
dequal@2.0.3:
dequal: private
devlop@1.1.0:
devlop: private
dom-accessibility-api@0.6.3:
dom-accessibility-api: private
dom-helpers@5.2.1:
dom-helpers: private
dompurify@3.3.1:
dompurify: private
dunder-proto@1.0.1:
dunder-proto: private
earcut@3.0.2:
earcut: private
electron-to-chromium@1.5.267:
electron-to-chromium: private
elkjs@0.11.0:
elkjs: private
entities@6.0.1:
entities: private
error-ex@1.3.4:
error-ex: private
es-define-property@1.0.1:
es-define-property: private
es-errors@1.3.0:
es-errors: private
es-module-lexer@1.7.0:
es-module-lexer: private
es-object-atoms@1.1.1:
es-object-atoms: private
es-set-tostringtag@2.1.0:
es-set-tostringtag: private
esbuild@0.25.12:
esbuild: private
escalade@3.2.0:
escalade: private
escape-string-regexp@4.0.0:
escape-string-regexp: private
eslint-config-prettier@10.1.8(eslint@9.39.2):
eslint-config-prettier: public
eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.7.4):
eslint-plugin-prettier: public
eslint-plugin-react-hooks@7.0.1(eslint@9.39.2):
eslint-plugin-react-hooks: public
eslint-plugin-react-refresh@0.4.26(eslint@9.39.2):
eslint-plugin-react-refresh: public
eslint-scope@8.4.0:
eslint-scope: public
eslint-visitor-keys@4.2.1:
eslint-visitor-keys: public
eslint@9.39.2:
eslint: public
espree@10.4.0:
espree: private
esquery@1.7.0:
esquery: private
esrecurse@4.3.0:
esrecurse: private
estraverse@5.3.0:
estraverse: private
estree-util-is-identifier-name@3.0.0:
estree-util-is-identifier-name: private
estree-walker@3.0.3:
estree-walker: private
esutils@2.0.3:
esutils: private
event-target-shim@5.0.1:
event-target-shim: private
events@3.3.0:
events: private
expect-type@1.3.0:
expect-type: private
extend@3.0.2:
extend: private
fast-deep-equal@3.1.3:
fast-deep-equal: private
fast-diff@1.3.0:
fast-diff: private
fast-json-stable-stringify@2.1.0:
fast-json-stable-stringify: private
fast-levenshtein@2.0.6:
fast-levenshtein: private
fdir@6.5.0(picomatch@4.0.3):
fdir: private
fflate@0.8.2:
fflate: private
file-entry-cache@8.0.0:
file-entry-cache: private
find-replace@5.0.2:
find-replace: private
find-root@1.1.0:
find-root: private
find-up@5.0.0:
find-up: private
flat-cache@4.0.1:
flat-cache: private
flatbuffers@25.9.23:
flatbuffers: private
flatted@3.3.3:
flatted: private
follow-redirects@1.15.11:
follow-redirects: private
form-data@4.0.5:
form-data: private
frontend:
frontend: private
fsevents@2.3.3:
@ -843,30 +551,10 @@ hoistedDependencies:
gensync: private
geojson-vt@4.0.2:
geojson-vt: private
get-intrinsic@1.3.0:
get-intrinsic: private
get-proto@1.0.1:
get-proto: private
get-stream@6.0.1:
get-stream: private
gl-matrix@3.4.4:
gl-matrix: private
glob-parent@6.0.2:
glob-parent: private
globals@16.5.0:
globals: private
gopd@1.2.0:
gopd: private
graphlib@2.1.8:
graphlib: private
hachure-fill@0.5.2:
hachure-fill: private
has-flag@4.0.0:
has-flag: private
has-symbols@1.1.0:
has-symbols: private
has-tostringtag@1.0.2:
has-tostringtag: private
hasown@2.0.2:
hasown: private
hast-util-from-parse5@8.0.3:
@ -875,8 +563,6 @@ hoistedDependencies:
hast-util-parse-selector: private
hast-util-raw@9.1.0:
hast-util-raw: private
hast-util-sanitize@5.0.2:
hast-util-sanitize: private
hast-util-to-jsx-runtime@2.3.6:
hast-util-to-jsx-runtime: private
hast-util-to-parse5@8.0.1:
@ -885,10 +571,6 @@ hoistedDependencies:
hast-util-whitespace: private
hastscript@9.0.1:
hastscript: private
hermes-estree@0.25.1:
hermes-estree: private
hermes-parser@0.25.1:
hermes-parser: private
hoist-non-react-statics@3.3.2:
hoist-non-react-statics: private
html-encoding-sniffer@6.0.0:
@ -903,16 +585,8 @@ hoistedDependencies:
https-proxy-agent: private
iconv-lite@0.6.3:
iconv-lite: private
ieee754@1.2.1:
ieee754: private
ignore@7.0.5:
ignore: private
import-fresh@3.3.1:
import-fresh: private
imurmurhash@0.1.4:
imurmurhash: private
indent-string@4.0.0:
indent-string: private
inline-style-parser@0.2.7:
inline-style-parser: private
internmap@2.0.3:
@ -921,26 +595,18 @@ hoistedDependencies:
is-alphabetical: private
is-alphanumerical@2.0.1:
is-alphanumerical: private
is-any-array@0.1.1:
is-any-array: private
is-arrayish@0.2.1:
is-arrayish: private
is-core-module@2.16.1:
is-core-module: private
is-decimal@2.0.1:
is-decimal: private
is-extglob@2.1.1:
is-extglob: private
is-glob@4.0.3:
is-glob: private
is-hexadecimal@2.0.1:
is-hexadecimal: private
is-plain-obj@4.1.0:
is-plain-obj: private
is-potential-custom-element-name@1.0.1:
is-potential-custom-element-name: private
isexe@2.0.0:
isexe: private
js-tokens@4.0.0:
js-tokens: private
js-yaml@4.1.1:
@ -949,46 +615,16 @@ hoistedDependencies:
jsdom: private
jsesc@3.1.0:
jsesc: private
json-bignum@0.0.3:
json-bignum: private
json-buffer@3.0.1:
json-buffer: private
json-parse-even-better-errors@2.3.1:
json-parse-even-better-errors: private
json-schema-traverse@0.4.1:
json-schema-traverse: private
json-stable-stringify-without-jsonify@1.0.1:
json-stable-stringify-without-jsonify: private
json-stringify-pretty-compact@4.0.0:
json-stringify-pretty-compact: private
json5@2.2.3:
json5: private
katex@0.16.27:
katex: private
kdbush@4.0.2:
kdbush: private
keyv@4.5.4:
keyv: private
khroma@2.1.0:
khroma: private
langium@3.3.1:
langium: private
layout-base@1.0.2:
layout-base: private
levn@0.4.1:
levn: private
lines-and-columns@1.2.4:
lines-and-columns: private
locate-path@6.0.0:
locate-path: private
lodash-es@4.17.22:
lodash-es: private
lodash.camelcase@4.3.0:
lodash.camelcase: private
lodash.merge@4.6.2:
lodash.merge: private
lodash@4.17.21:
lodash: private
longest-streak@3.1.0:
longest-streak: private
loose-envify@1.4.0:
@ -997,18 +633,12 @@ hoistedDependencies:
lru-cache: private
lucide-react@0.511.0(react@19.2.3):
lucide-react: private
lz-string@1.5.0:
lz-string: private
magic-string@0.30.21:
magic-string: private
maplibre-gl@5.15.0:
maplibre-gl: private
markdown-table@3.0.4:
markdown-table: private
marked@16.4.2:
marked: private
math-intrinsics@1.1.0:
math-intrinsics: private
mdast-util-find-and-replace@3.0.2:
mdast-util-find-and-replace: private
mdast-util-from-markdown@2.0.2:
@ -1041,10 +671,6 @@ hoistedDependencies:
mdast-util-to-string: private
mdn-data@2.12.2:
mdn-data: private
mermaid@11.12.2:
mermaid: private
meshoptimizer@0.22.0:
meshoptimizer: private
micromark-core-commonmark@2.0.3:
micromark-core-commonmark: private
micromark-extension-gfm-autolink-literal@2.1.0:
@ -1101,54 +727,22 @@ hoistedDependencies:
micromark-util-types: private
micromark@4.0.2:
micromark: private
mime-db@1.52.0:
mime-db: private
mime-types@2.1.35:
mime-types: private
min-indent@1.0.1:
min-indent: private
minimatch@3.1.2:
minimatch: private
minimist@1.2.8:
minimist: private
ml-array-max@1.2.4:
ml-array-max: private
ml-array-min@1.2.3:
ml-array-min: private
ml-array-rescale@1.3.7:
ml-array-rescale: private
ml-levenberg-marquardt@2.1.1:
ml-levenberg-marquardt: private
ml-matrix@6.12.1:
ml-matrix: private
mlly@1.8.0:
mlly: private
mrmime@2.0.1:
mrmime: private
ms@2.1.3:
ms: private
murmurhash-js@1.0.0:
murmurhash-js: private
n3@1.26.0:
n3: private
nanoid@3.3.11:
nanoid: private
natural-compare@1.4.0:
natural-compare: private
node-releases@2.0.27:
node-releases: private
object-assign@4.1.1:
object-assign: private
obug@2.1.1:
obug: private
optionator@0.9.4:
optionator: private
p-limit@3.1.0:
p-limit: private
p-locate@5.0.0:
p-locate: private
package-manager-detector@1.6.0:
package-manager-detector: private
packages/api-client:
'@glam/api-client': private
packages/hooks:
@ -1165,14 +759,8 @@ hoistedDependencies:
parse-entities: private
parse-json@5.2.0:
parse-json: private
parse5@8.0.0:
parse5@7.3.0:
parse5: private
path-data-parser@0.1.0:
path-data-parser: private
path-exists@4.0.0:
path-exists: private
path-key@3.1.1:
path-key: private
path-parse@1.0.7:
path-parse: private
path-type@4.0.0:
@ -1185,38 +773,20 @@ hoistedDependencies:
picocolors: private
picomatch@4.0.3:
picomatch: private
pkg-types@1.3.1:
pkg-types: private
playwright-core@1.57.0:
playwright-core: private
playwright@1.57.0:
playwright: private
points-on-curve@0.2.0:
points-on-curve: private
points-on-path@0.2.1:
points-on-path: private
postcss@8.5.6:
postcss: private
potpack@2.1.0:
potpack: private
prelude-ls@1.2.1:
prelude-ls: private
prettier-linter-helpers@1.0.1:
prettier-linter-helpers: public
prettier@3.7.4:
prettier: public
pretty-format@27.5.1:
pretty-format: private
process@0.11.10:
process: private
prop-types@15.8.1:
prop-types: private
property-information@7.1.0:
property-information: private
protocol-buffers-schema@3.6.0:
protocol-buffers-schema: private
proxy-from-env@1.1.0:
proxy-from-env: private
punycode@2.3.1:
punycode: private
quickselect@3.0.0:
@ -1237,14 +807,8 @@ hoistedDependencies:
react-transition-group: private
react@19.2.3:
react: private
readable-stream@4.7.0:
readable-stream: private
redent@3.0.0:
redent: private
rehype-raw@7.0.0:
rehype-raw: private
rehype-sanitize@6.0.0:
rehype-sanitize: private
remark-gfm@4.0.1:
remark-gfm: private
remark-parse@11.0.0:
@ -1265,12 +829,8 @@ hoistedDependencies:
robust-predicates: private
rollup@4.55.1:
rollup: private
roughjs@4.6.6:
roughjs: private
rw@1.3.3:
rw: private
safe-buffer@5.2.1:
safe-buffer: private
safer-buffer@2.1.2:
safer-buffer: private
saxes@6.0.0:
@ -1281,10 +841,6 @@ hoistedDependencies:
semver: private
set-cookie-parser@2.7.2:
set-cookie-parser: private
shebang-command@2.0.0:
shebang-command: private
shebang-regex@3.0.0:
shebang-regex: private
siginfo@2.0.0:
siginfo: private
sirv@3.0.2:
@ -1299,36 +855,20 @@ hoistedDependencies:
stackback: private
std-env@3.10.0:
std-env: private
string_decoder@1.3.0:
string_decoder: private
stringify-entities@4.0.4:
stringify-entities: private
strip-indent@3.0.0:
strip-indent: private
strip-json-comments@3.1.1:
strip-json-comments: private
style-mod@4.1.3:
style-mod: private
style-to-js@1.1.21:
style-to-js: private
style-to-object@1.0.14:
style-to-object: private
stylis@4.3.6:
stylis@4.2.0:
stylis: private
supercluster@8.0.1:
supercluster: private
supports-color@7.2.0:
supports-color: private
supports-preserve-symlinks-flag@1.0.0:
supports-preserve-symlinks-flag: private
symbol-tree@3.2.4:
symbol-tree: private
synckit@0.11.11:
synckit: private
table-layout@4.1.1:
table-layout: private
three@0.181.2:
three: private
tinybench@2.9.0:
tinybench: private
tinyexec@1.0.2:
@ -1353,22 +893,6 @@ hoistedDependencies:
trim-lines: private
trough@2.2.0:
trough: private
ts-api-utils@2.4.0(typescript@5.9.3):
ts-api-utils: private
ts-dedent@2.2.0:
ts-dedent: private
tslib@2.8.1:
tslib: private
type-check@0.4.0:
type-check: private
typescript-eslint@8.52.0(eslint@9.39.2)(typescript@5.9.3):
typescript-eslint: public
typical@7.3.0:
typical: private
ufo@1.6.2:
ufo: private
umap-js@1.4.0:
umap-js: private
undici-types@7.16.0:
undici-types: private
unified@11.0.5:
@ -1385,10 +909,6 @@ hoistedDependencies:
unist-util-visit: private
update-browserslist-db@1.2.3(browserslist@4.28.1):
update-browserslist-db: private
uri-js@4.4.1:
uri-js: private
uuid@11.1.0:
uuid: private
vfile-location@5.0.3:
vfile-location: private
vfile-message@4.0.3:
@ -1399,20 +919,6 @@ hoistedDependencies:
vite: private
vitest@4.0.16(@types/node@24.10.4)(@vitest/ui@4.0.16)(jsdom@27.4.0):
vitest: private
vscode-jsonrpc@8.2.0:
vscode-jsonrpc: private
vscode-languageserver-protocol@3.17.5:
vscode-languageserver-protocol: private
vscode-languageserver-textdocument@1.0.12:
vscode-languageserver-textdocument: private
vscode-languageserver-types@3.17.5:
vscode-languageserver-types: private
vscode-languageserver@9.0.1:
vscode-languageserver: private
vscode-uri@3.0.8:
vscode-uri: private
w3c-keyname@2.2.8:
w3c-keyname: private
w3c-xmlserializer@5.0.0:
w3c-xmlserializer: private
web-namespaces@2.0.1:
@ -1423,14 +929,8 @@ hoistedDependencies:
whatwg-mimetype: private
whatwg-url@15.1.0:
whatwg-url: private
which@2.0.2:
which: private
why-is-node-running@2.3.0:
why-is-node-running: private
word-wrap@1.2.5:
word-wrap: private
wordwrapjs@5.1.1:
wordwrapjs: private
ws@8.19.0:
ws: private
xml-name-validator@5.0.0:
@ -1441,14 +941,6 @@ hoistedDependencies:
yallist: private
yaml@1.10.2:
yaml: private
yocto-queue@0.1.0:
yocto-queue: private
zod-validation-error@4.0.2(zod@4.3.5):
zod-validation-error: private
zod@4.3.5:
zod: private
zustand@5.0.9(@types/react@19.2.7)(react@19.2.3):
zustand: private
zwitch@2.0.4:
zwitch: private
included:

5
node_modules/.pnpm/lock.yaml generated vendored
View file

@ -75,6 +75,9 @@ importers:
specifier: ^4.0.1
version: 4.0.1
devDependencies:
'@playwright/test':
specifier: ^1.56.1
version: 1.57.0
'@types/d3':
specifier: ^7.4.3
version: 7.4.3
@ -82,7 +85,7 @@ importers:
specifier: ^4.0.9
version: 4.0.9
'@types/node':
specifier: ^24.10.1
specifier: ^24.10.4
version: 24.10.4
'@types/react':
specifier: ^19.2.5

View file

@ -1 +1 @@
../parse5@8.0.0/node_modules/parse5
../parse5@7.3.0/node_modules/parse5

View file

@ -1 +1 @@
../stylis@4.3.6/node_modules/stylis
../stylis@4.2.0/node_modules/stylis

View file

@ -75,6 +75,9 @@ importers:
specifier: ^4.0.1
version: 4.0.1
devDependencies:
'@playwright/test':
specifier: ^1.56.1
version: 1.57.0
'@types/d3':
specifier: ^7.4.3
version: 7.4.3
@ -82,7 +85,7 @@ importers:
specifier: ^4.0.9
version: 4.0.9
'@types/node':
specifier: ^24.10.1
specifier: ^24.10.4
version: 24.10.4
'@types/react':
specifier: ^19.2.5

View file

@ -1,22 +1,44 @@
id: https://nde.nl/ontology/hc/slot/abbreviation
name: abbreviation_slot
title: abbreviation slot
id: https://nde.nl/ontology/hc/slot/has_or_had_abbreviation
name: has_or_had_abbreviation_slot
title: Has Or Had Abbreviation Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
skos: http://www.w3.org/2004/02/skos/core#
gleif-base: https://www.gleif.org/ontology/Base/
dbp: http://dbpedia.org/ontology/
gn: http://www.geonames.org/ontology#
imports:
- linkml:types
default_prefix: hc
slots:
abbreviation:
slot_uri: schema:alternateName
has_or_had_abbreviation:
slot_uri: gleif-base:hasAbbreviation
description: |
Common abbreviation (may differ from official codes).
Common abbreviation for the institution that is currently used or was
historically used. May differ from official codes like ISIL.
This is a temporal relationship following RiC-O naming conventions -
an institution may have had different abbreviations over time.
gleif-base:hasAbbreviation - "An abbreviation for the entity identified."
(subproperty of skos:altLabel)
Examples:
- "LOC" or "LC" (Library of Congress)
- "KB" (Koninklijke Bibliotheek, but uses NTA in VIAF)
- "BnF" (matches VIAF code)
range: string
multivalued: true
exact_mappings:
- gleif-base:hasAbbreviation
close_mappings:
- skos:altLabel
- schema:alternateName
- dbp:abbreviation
- gn:alternateName
annotations:
custodian_types: '["*"]'
custodian_types_rationale: All heritage custodian types may have abbreviations

View file

@ -1,15 +1,37 @@
id: https://nde.nl/ontology/hc/slot/about_digital_presence
name: about_digital_presence_slot
title: About Digital Presence Slot
id: https://nde.nl/ontology/hc/slot/is_or_was_about_digital_presence
name: is_or_was_about_digital_presence_slot
title: Is Or Was About Digital Presence Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
rico: https://www.ica.org/standards/RiC/ontology#
schema: http://schema.org/
dcterms: http://purl.org/dc/terms/
imports:
- linkml:types
- linkml:types
default_prefix: hc
slots:
about_digital_presence:
description: Digital presence being characterized (DigitalPlatform, AuxiliaryDigitalPlatform,
SocialMediaProfile, or InternetOfThings)
is_or_was_about_digital_presence:
slot_uri: rico:isOrWasSubjectOf
description: |
The digital presence that this characterization or observation is or was about.
This follows RiC-O naming conventions for temporal relationships.
A characterization may describe a digital presence that no longer exists
or has changed since the observation was made.
Applicable to: DigitalPlatform, AuxiliaryDigitalPlatform, SocialMediaProfile,
or InternetOfThings.
RiC-O: isOrWasSubjectOf - "Connects an entity to something that describes
or refers to it as subject matter."
range: uriorcurie
slot_uri: hc:aboutDigitalPresence
exact_mappings:
- rico:isOrWasSubjectOf
close_mappings:
- dcterms:subject
- schema:about
annotations:
custodian_types: '["*"]'
custodian_types_rationale: All heritage custodian types may have digital presences

View file

@ -1,14 +1,39 @@
id: https://nde.nl/ontology/hc/slot/about_text
name: about_text_slot
title: About Text Slot
id: https://nde.nl/ontology/hc/slot/has_or_had_about_text
name: has_or_had_about_text_slot
title: Has Or Had About Text Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
rico: https://www.ica.org/standards/RiC/ontology#
schema: http://schema.org/
dcterms: http://purl.org/dc/terms/
tooi: https://identifier.overheid.nl/tooi/def/ont/
imports:
- linkml:types
- linkml:types
default_prefix: hc
slots:
about_text:
description: About/summary section text
has_or_had_about_text:
slot_uri: dcterms:abstract
description: |
About/summary section text that currently describes or previously described
this entity.
This follows RiC-O naming conventions - an institution's "about" text
may change over time as descriptions are updated.
dcterms:abstract - "A summary of the resource."
Related: tooi:onderwerp (Dutch: subject description, subproperty of
dcterms:description) for Dutch government organizations.
range: string
slot_uri: hc:aboutText
exact_mappings:
- dcterms:abstract
close_mappings:
- dcterms:description
- schema:description
- schema:abstract
- tooi:onderwerp
annotations:
custodian_types: '["*"]'
custodian_types_rationale: All heritage custodian types may have about/summary text

View file

@ -1,26 +1,50 @@
id: https://nde.nl/ontology/hc/slot/academic_affiliation
name: academic_affiliation_slot
title: Academic Affiliation Slot
id: https://nde.nl/ontology/hc/slot/has_or_had_academic_affiliation
name: has_or_had_academic_affiliation_slot
title: Has Or Had Academic Affiliation Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
org: http://www.w3.org/ns/org#
schema: http://schema.org/
rico: https://www.ica.org/standards/RiC/ontology#
pico: https://w3id.org/pico/vocab#
imports:
- linkml:types
- linkml:types
default_prefix: hc
slots:
academic_affiliation:
slot_uri: org:memberOf
description: 'Link to parent university, research network, or academic institution.
has_or_had_academic_affiliation:
slot_uri: schema:affiliation
description: |
Link to parent university, research network, or academic institution
that this entity is or was affiliated with.
This follows RiC-O naming conventions - academic affiliations can change
over time as research centers move between institutions or as partnerships
form and dissolve.
For research centers that are part of larger academic structures.
Format: URI to parent organization.
'
schema:affiliation - "An organization that this person is affiliated with."
(Note: Schema.org defines this for Person, but we extend to organizations)
org:memberOf - "Indicates that a person is a member of the Organization
without precision about the nature of that engagement."
range: uri
multivalued: true
required: false
exact_mappings:
- schema:affiliation
close_mappings:
- org:memberOf
- rico:isOrWasMemberOf
- pico:hasAffiliation
examples:
- value: https://www.universiteitleiden.nl
description: Leiden University affiliation
- value: https://www.knaw.nl
description: Royal Netherlands Academy of Arts and Sciences
- value: https://www.universiteitleiden.nl
description: Leiden University affiliation
- value: https://www.knaw.nl
description: Royal Netherlands Academy of Arts and Sciences
annotations:
custodian_types: '["R", "E"]'
custodian_types_rationale: Primarily for Research centers (R) and Educational providers (E)

View file

@ -1,14 +1,39 @@
id: https://nde.nl/ontology/hc/slot/academic_programs
name: academic_programs_slot
title: Academic Programs Slot
id: https://nde.nl/ontology/hc/slot/has_or_had_academic_program
name: has_or_had_academic_program_slot
title: Has or Had Academic Program Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: https://schema.org/
dbp: http://dbpedia.org/property/
imports:
- linkml:types
default_prefix: hc
slots:
academic_programs:
has_or_had_academic_program:
description: >-
Academic programs offered by a heritage institution, such as museum studies,
archival science, conservation, or library science programs. Uses RiC-O style
temporal naming to indicate programs may be active or historical.
The slot_uri schema:hasCourse indicates a course or program that is part of an
educational offering. From Schema.org: "A description of the qualification,
award, certificate, diploma or other educational credential awarded as a
consequence of successful completion of this course or program."
range: string
multivalued: true
slot_uri: aiiso:programme
slot_uri: schema:hasCourse
exact_mappings:
- schema:hasCourse
close_mappings:
- dbp:programCost
annotations:
custodian_types: '["E", "R", "M", "L", "A"]'
custodian_types_rationale: >-
Primarily relevant for Education providers (E), Research centers (R), and
heritage institutions with educational programs (M, L, A).
custodian_types_primary: E
specificity_score: 0.65
specificity_rationale: >-
Moderately specific - primarily applies to institutions with formal
educational programs, not all heritage custodians.

View file

@ -1,14 +1,44 @@
id: https://nde.nl/ontology/hc/slot/accepts_external_work
name: accepts_external_work_slot
title: Accepts External Work Slot
id: https://nde.nl/ontology/hc/slot/accepts_or_accepted_external_work
name: accepts_or_accepted_external_work_slot
title: Accepts or Accepted External Work Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: https://schema.org/
gr: http://purl.org/goodrelations/v1#
imports:
- linkml:types
default_prefix: hc
slots:
accepts_external_work:
description: Accepts external conservation work
accepts_or_accepted_external_work:
description: >-
Indicates whether a conservation lab or restoration facility accepts external
conservation work from other institutions or private clients. Uses RiC-O style
temporal naming because service availability can change over time (a lab may
stop or start accepting external commissions).
The slot_uri gr:eligibleCustomerTypes from GoodRelations ontology indicates
the types of customers eligible for an offering. Since we're modeling whether
external parties can commission work, this captures service availability.
No perfect ontology match exists, so we use a heritage custodian namespace
predicate with mappings to related concepts.
range: boolean
slot_uri: hc:acceptsExternalWork
slot_uri: hc:acceptsOrAcceptedExternalWork
exact_mappings: []
close_mappings:
- gr:eligibleCustomerTypes
- schema:areaServed
related_mappings:
- schema:serviceType
- schema:availableChannel
annotations:
custodian_types: '["M", "A", "L", "R"]'
custodian_types_rationale: >-
Relevant for Museums with conservation labs (M), Archives with preservation
facilities (A), Libraries with restoration services (L), and Research centers
with conservation departments (R).
custodian_types_primary: M
specificity_score: 0.80
specificity_rationale: >-
Highly specific - only applies to heritage institutions with active
conservation/restoration facilities that may offer external services.

View file

@ -1,15 +1,43 @@
id: https://nde.nl/ontology/hc/slot/accepts_payment_methods
name: accepts_payment_methods_slot
title: Accepts Payment Methods Slot
id: https://nde.nl/ontology/hc/slot/accepts_or_accepted_payment_method
name: accepts_or_accepted_payment_method_slot
title: Accepts or Accepted Payment Method Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: https://schema.org/
gr: http://purl.org/goodrelations/v1#
imports:
- linkml:types
default_prefix: hc
slots:
accepts_payment_methods:
description: Payment methods accepted
accepts_or_accepted_payment_method:
description: >-
Payment methods accepted by a heritage institution for admission fees, shop
purchases, donations, or services. Uses RiC-O style temporal naming because
accepted payment methods can change over time (e.g., adoption of contactless
payments, cryptocurrency, etc.).
The slot_uri schema:paymentAccepted from Schema.org indicates "Cash, Credit Card,
Cryptocurrency, Local Exchange Tradings System, etc." From Schema.org: "The
payment method(s) accepted by seller for this offer."
Also maps to schema:acceptedPaymentMethod which is the object property version
linking to PaymentMethod instances rather than string values.
range: string
multivalued: true
slot_uri: hc:acceptsPaymentMethods
slot_uri: schema:paymentAccepted
exact_mappings:
- schema:paymentAccepted
close_mappings:
- schema:acceptedPaymentMethod
- gr:acceptedPaymentMethods
annotations:
custodian_types: '["*"]'
custodian_types_rationale: >-
Applicable to all heritage custodian types that have visitor services,
shops, or accept donations.
custodian_types_primary: M
specificity_score: 0.40
specificity_rationale: >-
Moderately broad - relevant for any institution with public-facing services
that involve financial transactions.