Ga naar hoofdinhoud

Verification Report

Generated: 2026-05-16T09:35:53.840500Z
Target: http://localhost:8080
Object triple: register=21 · schema=166 · object=25706ca9-c989-4d6b-9f7b-98cf1cc70639
Providers advertised: 24
Pass (non-crashing, 2xx or 503-degraded): 24 / 24

Generated by sequential curl probes against a live OpenRegister with 13 required Nextcloud apps installed (calendar, contacts, deck, mail, spreed, bookmarks, collectives, maps, photos, polls, forms, cospend, analytics, timemanager). The seeded integration-verification register holds a single probe object the harness targets.

What the harness checks

Per provider:

  1. OCS metadata — the provider appears in ocs/v2.php/cloud/capabilities under openregister.integrations.providers with the documented shape (id, label, group, enabled, storageStrategy, surfaces, authStatus).
  2. Sub-resource probeGET /index.php/apps/openregister/api/objects/{register}/{schema}/{objectId}/integrations/{providerId} with OCS-APIRequest: true returns a list envelope (HTTP 200, {items: [...]}) or the documented degraded source 503 with a structured cause.
  3. No hidden crashes — HTTP 500 anywhere fails the run. Provider exceptions like NoVtodoCalendarException must be caught and converted to an empty list, not bubbled to the controller.

Earlier runs reported 412s across the board — that was a CSRF false-pass; the probe was being rejected at the session-CSRF guard before reaching any provider. The current harness sets OCS-APIRequest: true on every request.

Summary table

IDGroupRequired appStorageStatusShapeLatencyNotes
calendarcommscalendarlink-table 200list-envelope610ms
contactscommscontactslink-table 200list-envelope629ms
emailcommsmaillink-table 200list-envelope1159ms
talkcommsspreedlink-table 200list-envelope599ms
audit-trailcorenonequery-time 200list-envelope579ms
filescorenonemagic-column 200list-envelope650ms
notescorenonelink-table 200list-envelope599ms
sharescorenonequery-time 200list-envelope598ms
tagscorenonelink-table 200list-envelope639ms
taskscorenonelink-table 200list-envelope596ms
bookmarksdocsbookmarkslink-table 200list-envelope589ms
collectivesdocscollectiveslink-table 200list-envelope613ms
mapsdocsmapslink-table 200list-envelope622ms
photosdocsphotoslink-table 200list-envelope596ms
openprojectexternalopenconnectorexternal 200list-envelope627ms
xwikiexternalopenconnectorexternal 200list-envelope595ms
activityworkflowactivityquery-time 200list-envelope588ms
analyticsworkflowanalyticslink-table 200list-envelope596ms
cospendworkflowcospendlink-table 200list-envelope592ms
deckworkflowdecklink-table 200list-envelope598ms
flowworkflowworkflowenginelink-table 200list-envelope599ms
formsworkflowformslink-table 200list-envelope597ms
pollsworkflowpollslink-table 200list-envelope581ms
time-trackerworkflowtimemanagerlink-table 200list-envelope582ms

Findings

  • 24 / 24 providers return HTTP 200 with the documented {items: []} list envelope. The seeded probe object has no linked upstream items in any leaf, so every list is empty — but the shape, the timing, and the success path are all proven.
  • 0 / 24 providers return HTTP 503. Both OpenConnector-backed externals (xwiki + openproject) are wired against real local services in docker-compose.integration-verification.yml. See xwiki and openproject for the setup paths.
  • 0 / 24 providers crash. An earlier tasks HTTP 500 — NoVtodoCalendarException thrown when the user has no VTODO-capable calendar — was fixed in this run: the provider now catches the exception and returns an empty list, treating "no calendar yet" as a setup state rather than a server error.

Per-group breakdown

Group: core

audit-trail — Audit trail

  • Required app: none
  • Storage strategy: query-time
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/audit-trail
  • Status: 200 (list-envelope, 579ms)

files — Files

  • Required app: none
  • Storage strategy: magic-column
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/files
  • Status: 200 (list-envelope, 650ms)

notes — Notes

  • Required app: none
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/notes
  • Status: 200 (list-envelope, 599ms)

shares — Shares

  • Required app: none
  • Storage strategy: query-time
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/shares
  • Status: 200 (list-envelope, 598ms)

tags — Tags

  • Required app: none
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/tags
  • Status: 200 (list-envelope, 639ms)

tasks — Tasks

  • Required app: none
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/tasks
  • Status: 200 (list-envelope, 596ms)

Group: comms

calendar — Meetings

  • Required app: calendar
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/calendar
  • Status: 200 (list-envelope, 610ms)

contacts — Contacts

  • Required app: contacts
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/contacts
  • Status: 200 (list-envelope, 629ms)

email — Emails

  • Required app: mail
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/email
  • Status: 200 (list-envelope, 1159ms)

talk — Chat

  • Required app: spreed
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/talk
  • Status: 200 (list-envelope, 599ms)

Group: docs

bookmarks — Bookmarks

  • Required app: bookmarks
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/bookmarks
  • Status: 200 (list-envelope, 589ms)

collectives — Knowledge

  • Required app: collectives
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/collectives
  • Status: 200 (list-envelope, 613ms)

maps — Location

  • Required app: maps
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/maps
  • Status: 200 (list-envelope, 622ms)

photos — Photos

  • Required app: photos
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/photos
  • Status: 200 (list-envelope, 596ms)

Group: workflow

activity — Activity

  • Required app: activity
  • Storage strategy: query-time
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/activity
  • Status: 200 (list-envelope, 588ms)

analytics — Analytics

  • Required app: analytics
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/analytics
  • Status: 200 (list-envelope, 596ms)

cospend — Costs

  • Required app: cospend
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/cospend
  • Status: 200 (list-envelope, 592ms)

deck — Cards

  • Required app: deck
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/deck
  • Status: 200 (list-envelope, 598ms)

flow — Automation

  • Required app: workflowengine
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/flow
  • Status: 200 (list-envelope, 599ms)

forms — Forms

  • Required app: forms
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/forms
  • Status: 200 (list-envelope, 597ms)

polls — Polls

  • Required app: polls
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/polls
  • Status: 200 (list-envelope, 581ms)

time-tracker — Time

  • Required app: timemanager
  • Storage strategy: link-table
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/time-tracker
  • Status: 200 (list-envelope, 582ms)

Group: external

openproject — Projects

  • Required app: openconnector
  • Storage strategy: external
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/openproject
  • Status: 200 (list-envelope, 627ms)

xwiki — Articles

  • Required app: openconnector
  • Storage strategy: external
  • Surfaces: user-dashboard, app-dashboard, detail-page, single-entity
  • Auth: ok / configured
  • Probe: GET /index.php/apps/openregister/api/objects/21/166/25706ca9-c989-4d6b-9f7b-98cf1cc70639/integrations/xwiki
  • Status: 200 (list-envelope, 595ms)

Reproducing locally

Against the OpenRegister dev container (admin:admin, default NEXTCLOUD_URL):

# Seed a sandbox register + schema + probe object (one-time)
curl -u admin:admin -H 'OCS-APIRequest: true' -X POST \\
http://localhost:8080/index.php/apps/openregister/api/registers \\
-d '{"slug":"integration-verification","title":"Integration Verification","schemas":[]}'

# PHPUnit — provider metadata + delegation tests (50 tests)
./vendor/bin/phpunit --testsuite "Unit Tests" --filter "LeafProvidersMetadataTest|XwikiProviderTest"

# Playwright — registry contract + per-leaf endpoint probe
NEXTCLOUD_URL=http://localhost:8080 npx playwright test tests/e2e/integration-registry.spec.ts --project=chromium

# Playwright — verification harness (writes tests/e2e/leaf-verification.json)
NEXTCLOUD_URL=http://localhost:8080 npx playwright test tests/e2e/leaf-verification.spec.ts --project=chromium