Skip to content

docs(parity): thematiq competitor columns re-read from source and public docs, sources objects, 36 demand-signal rows - #669

Merged
rubenvdlinde merged 8 commits into
developmentfrom
parity/wave5-source-reads
Sep 26, 2026
Merged

rubenvdlinde merged 8 commits into
developmentfrom
parity/wave5-source-reads

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Wave 5 re-read of thematiq's five competitor columns. Open-source systems were read from their source at a named tag, and closed systems from public vendor documents. Every system now has a sources object, and 36 demand-signal rows are mined with origin and originUrl. Only openspec/parity/capabilities.json changes. It is a data file under openspec/ with no page wired to it, so no suite can be affected, and none were run.

Base: development at 45935e0. Verifier: hydra development .claude/skills/parity-verify/parity_verify.py, fetched fresh after ed83086 (hydra#707, origin is a free string).

Verifier before (45935e0)

parity-verify: _lane/cap-before.json
  154 rated rows, 0 pending, 6 systems

system-without-sources  (5)
    system 'nextcloud-theming' has no sources object, so nobody can tell which of its docs, roadmap, changelog and tenders were looked for
    system 'm365-branding' has no sources object, so nobody can tell which of its docs, roadmap, changelog and tenders were looked for
    system 'opendesk' has no sources object, so nobody can tell which of its docs, roadmap, changelog and tenders were looked for
    system 'liferay-dxp' has no sources object, so nobody can tell which of its docs, roadmap, changelog and tenders were looked for
    system 'tokens-studio' has no sources object, so nobody can tell which of its docs, roadmap, changelog and tenders were looked for

unknown-cells  (1)
    158 cells rate unknown. That is legitimate, and it is listed so it cannot hide: capabilities[cat-completeness-badge] m365-branding, capabilities[cat-completeness-badge] liferay-dxp, capabilities[cat-design-system-docs] m365-branding, capabilities[cat-design-system-docs] liferay-dxp, capabilities[cat-marketplace] m365-branding, capabilities[app-diff-dialog] m365-branding, capabilities[app-diff-dialog] liferay-dxp, capabilities[app-choose-what-changes] m365-branding

6 finding(s) in 2 check(s)
report-only: pass --strict to fail on these

--strict:
parity-verify: _lane/cap-before.json
  154 rated rows, 0 pending, 6 systems

unknown-cells  (1)
    158 cells rate unknown. That is legitimate, and it is listed so it cannot hide: capabilities[cat-completeness-badge] m365-branding, capabilities[cat-completeness-badge] liferay-dxp, capabilities[cat-design-system-docs] m365-branding, capabilities[cat-design-system-docs] liferay-dxp, capabilities[cat-marketplace] m365-branding, capabilities[app-diff-dialog] m365-branding, capabilities[app-diff-dialog] liferay-dxp, capabilities[app-choose-what-changes] m365-branding

1 finding(s) in 1 check(s)

Verifier after

parity-verify: openspec/parity/capabilities.json
  190 rated rows, 0 pending, 6 systems

unknown-cells  (1)
    89 cells rate unknown. That is legitimate, and it is listed so it cannot hide: capabilities[cat-completeness-badge] m365-branding, capabilities[cat-design-system-docs] liferay-dxp, capabilities[app-diff-dialog] m365-branding, capabilities[app-diff-dialog] liferay-dxp, capabilities[app-scheduled-switch] m365-branding, capabilities[aut-figma-sync] m365-branding, capabilities[typ-air-gapped] liferay-dxp, capabilities[typ-dyslexia-font] m365-branding

1 finding(s) in 1 check(s)
report-only: pass --strict to fail on these

--strict:
parity-verify: openspec/parity/capabilities.json
  190 rated rows, 0 pending, 6 systems

unknown-cells  (1)
    89 cells rate unknown. That is legitimate, and it is listed so it cannot hide: capabilities[cat-completeness-badge] m365-branding, capabilities[cat-design-system-docs] liferay-dxp, capabilities[app-diff-dialog] m365-branding, capabilities[app-diff-dialog] liferay-dxp, capabilities[app-scheduled-switch] m365-branding, capabilities[aut-figma-sync] m365-branding, capabilities[typ-air-gapped] liferay-dxp, capabilities[typ-dyslexia-font] m365-branding

1 finding(s) in 1 check(s)

Strict is left with the unknown census only. Each remaining unknown carries its own not checked reason.

Grades per system

system how read grade before grade after
nextcloud-theming source, nextcloud/server v35.0.1 (apps/theming, core, settings, admin_audit, lib/private/Mail; sparse clone) docs-only docs-only, readOn 2026-09-26
m365-branding public docs (learn.microsoft.com, the Microsoft 365 roadmap feed) docs-only docs-only, readOn 2026-09-26
opendesk source, openDesk v1.18.2 plus its component charts; bundled Nextcloud 33.0.9 via the contents API docs-only docs-only, readOn 2026-09-26
liferay-dxp public docs (learn.liferay.com, liferay.dev, public LPD issues) docs-only docs-only, readOn 2026-09-26
tokens-studio source, tokens-studio/figma-plugin 2.12.1; Studio platform from docs docs-only docs-only, readOn 2026-09-26

No system was booted, so under the brief's rule none can be graded driven. A source read without a boot is graded docs-only, and each such cell's evidence names the tag.

Rating deltas per column (the 154 rows present on development)

system before (yes/partial/no/unknown) after, 154 rows cells changed transitions
nextcloud-theming 36/22/95/1 38/27/88/1 18 no>partial 7, no>yes 1, partial>no 1, partial>yes 5, yes>partial 4
m365-branding 32/27/34/61 42/51/41/20 48 no>partial 3, partial>yes 3, unknown>no 10, unknown>partial 23, unknown>yes 8, yes>partial 1
opendesk 18/16/88/32 21/34/93/6 40 no>partial 7, no>yes 3, partial>no 2, unknown>no 13, unknown>partial 11, unknown>yes 2, yes>partial 2
liferay-dxp 37/24/32/61 38/48/53/15 57 no>partial 4, partial>no 1, partial>yes 2, unknown>no 23, unknown>partial 20, unknown>yes 3, yes>no 1, yes>partial 3
tokens-studio 18/11/122/3 26/18/106/4 24 no>partial 10, no>unknown 4, no>yes 3, partial>yes 4, unknown>no 1, unknown>partial 1, unknown>yes 1

The thematiq column is unchanged on all 154 rows.

Every rating change (before > after, evidence abridged; full evidence is in the file)

nextcloud-theming: 18 changes
  • cat-stock-option yes > partial: nextcloud/server@v35.0.1 apps/theming/appinfo/routes.php:26-29 and lib/Controller/ThemingContro...
  • app-trial-discard partial > no: nextcloud/server@v35.0.1 apps/theming/lib/ThemingDefaults.php:495-530 undo() deletes the key an...
  • app-reset-core yes > partial: nextcloud/server@v35.0.1 apps/theming/lib/Controller/ThemingController.php:331-345 undoAll() is...
  • aut-custom-css no > partial: nextcloud/server@v35.0.1 no admin CSS field exists in apps/theming (ITheme::getCustomCss() retu...
  • typ-air-gapped partial > yes: nextcloud/server@v35.0.1 apps/theming/lib/Themes/DefaultTheme.php:203 uses system fonts only an...
  • ast-icon-contrast partial > yes: nextcloud/server@v35.0.1 header icons take --color-background-plain-text, black or white by a 4...
  • sur-conduction-apps no > partial: nextcloud/server@v35.0.1 apps built on @nextcloud/vue read the variables that lib/Service/Theme...
  • sur-menu-labels no > yes: nextcloud/server@v35.0.1 core/src/components/AppMenuItem.vue:81-83 renders each app tile with i...
  • sur-hide-slogan partial > yes: nextcloud/server@v35.0.1 apps/theming/src/components/admin/TextField.vue:47-60 lets the admin c...
  • sur-public-pages partial > yes: nextcloud/server@v35.0.1 core/templates/layout.public.php:51-66 renders the themed logo and ins...
  • sur-status-tokens yes > partial: nextcloud/server@v35.0.1 apps/theming/lib/Themes/DefaultTheme.php:94-105,164-181 define --color...
  • sur-office-suite no > partial: nextcloud/server@v35.0.1 Talk and other Nextcloud apps render inside the themed shell and read ...
  • acc-shipped-audit partial > yes: nextcloud/server@v35.0.1 tests/Themes/AccessibleThemeTestCase.php:24-240 asserts text pairs at ...
  • acc-focus-indicators no > partial: nextcloud/server@v35.0.1 core/css/apps.scss:445,905,1186 draw focus-visible rings in var(--colo...
  • acc-block-inaccessible no > partial: nextcloud/server@v35.0.1 apps/theming/lib/Controller/ThemingController.php:115-130 accepts any ...
  • gov-app-store-install yes > partial: nextcloud/server@v35.0.1 apps/theming/appinfo/info.xml ships theming inside the server; it is i...
  • gov-licence-clarity no > partial: nextcloud/server@v35.0.1 apps/theming/REUSE.toml:12-22 states OFL-1.1-RFN for the OpenDyslexic ...
  • int-health no > partial: nextcloud/server@v35.0.1 apps/theming/lib/SetupChecks/PhpImagickModule.php:35-45 is a setup che...
m365-branding: 48 changes
opendesk: 40 changes
  • cat-lasuite partial > no: opendesk@v1.18.2 helmfile/apps/notes/values.yaml.gotmpl:124 sets the La Suite Docs (impress) fr...
  • cat-stock-option partial > no: opendesk-nextcloud-image@v2.17.2 src/files/usr/local/bin/entrypoint/php/nextcloud_configure_the...
  • app-diff-dialog no > partial: opendesk@v1.18.2 docs/requirements.md:177: helmfile requires helm-diff to compare desired again...
  • app-primary-lock unknown > partial: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:28-29: one 'primary' key fans ...
  • aut-upload-css no > partial: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:152-154 styles.portal.main tak...
  • aut-token-reset no > partial: opendesk@v1.18.2 helmfile/bases/environments.yaml.gotmpl:4-13 layers environment values over he...
  • aut-overrides-persist no > yes: opendesk@v1.18.2: overrides live in the operator's values files and are re-rendered on every he...
  • aut-overrides-import-export no > yes: opendesk@v1.18.2 helmfile/bases/environments.yaml.gotmpl:4-13: overrides are plain files (helmf...
  • aut-custom-css no > partial: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:152-154 free-form CSS for the ...
  • aut-component-scoped unknown > partial: opendesk@v1.18.2 helmfile/files/theme/portal/stylesheet.css:68-85 defines button-scoped tokens ...
  • aut-semantic-aliases no > partial: opendesk@v1.18.2 helmfile/files/theme/portal/stylesheet.css:16-27,68-85 builds semantic tokens ...
  • aut-git-sync no > yes: opendesk@v1.18.2: the token source is plain files in the helmfile repository (theme.yaml.gotmpl...
  • typ-bundled-open-fonts unknown > no: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl: no font key for the web UI (o...
  • typ-air-gapped unknown > no: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:135-145: the only font setting...
  • typ-upload-font unknown > no: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:135-145: fonts only for OpenPr...
  • typ-font-validate unknown > no: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:140 'Only .ttf font files are ...
  • typ-font-list-delete unknown > no: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:135-145: fonts are URLs in val...
  • typ-font-login unknown > no: opendesk@v1.18.2 helmfile/files/theme/portal/stylesheet.css:124-197 Keycloak login rules set no...
  • typ-font-tokens unknown > partial: opendesk@v1.18.2 helmfile/files/theme/portal/stylesheet.css:48-58 defines --font-size-1..5, --f...
  • typ-dyslexia-font unknown > partial: nextcloud/server@v33.0.9 apps/theming/lib/Service/ThemesService.php:35 registers DyslexiaFont; ...
  • typ-org-font-library unknown > no: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:13-154: the whole theming surf...
  • ast-icon-contrast unknown > no: opendesk@v1.18.2: no icon contrast handling in theme or stylesheet; issue feat(tokens): Conduction 2026, built from identity.conduction.nl and nothing else #355 (users with low ...
  • sur-hide-slogan unknown > partial: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:18 slogan -> opendesk-nextclou...
  • sur-public-pages unknown > yes: opendesk-nextcloud-image@v2.17.2 nextcloud_configure_theming.php:21-114 sets the instance-level...
  • sur-component-bridge unknown > no: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:13-154: the whole theming surf...
  • sur-nc-variable-mapping unknown > no: opendesk-nextcloud-image@v2.17.2 nextcloud_configure_theming.php:21-114 sets only primary_color...
  • sur-office-suite yes > partial: opendesk@v1.18.2: chat (Element, values-element.yaml.gotmpl:20-22) and groupware (OX, values-op...
  • sur-footer-links yes > partial: opendesk@v1.18.2 helmfile/environments/default/functional.yaml.gotmpl:448-457 legal notice, pri...
  • sco-per-app-exclude no > partial: opendesk@v1.18.2 helmfile/environments/default/customization.yaml.gotmpl:4-24 loads a custom va...
  • sco-user-choice unknown > partial: opendesk-nextcloud-image@v2.17.2 nextcloud_configure_theming.php:16-17 disables only user colou...
  • sco-user-follow-os unknown > partial: nextcloud/server@v33.0.9 apps/theming/lib/Themes (DarkTheme, HighContrastTheme prefers-contrast...
  • sco-tenant-isolation unknown > no: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:13-154: the whole theming surf...
  • acc-contrast-evaluate unknown > no: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:13-154: the whole theming surf...
  • acc-shipped-audit unknown > partial: https://docs.opendesk.eu/legal/barrierefreiheit/ (read 2026-09-26): the one shipped brand was a...
  • acc-contrast-report-doc unknown > partial: https://docs.opendesk.eu/legal/barrierefreiheit/ (read 2026-09-26): published per-application B...
  • acc-compliance-report unknown > no: opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:13-154: the whole theming surf...
  • acc-dark-mode unknown > partial: nextcloud/server@v33.0.9 DarkTheme stays user-selectable and follows the OS, using the primary ...
  • gov-licence-clarity unknown > yes: opendesk@v1.18.2 REUSE.toml:21-24 states Apache-2.0 for helmfile/files/theme/** (every bundled ...
  • int-capability-api unknown > partial: nextcloud/server@v33.0.9 apps/theming/lib/Capabilities.php:98-108 exposes name, slogan, color, ...
  • int-tokens-for-other-apps no > partial: Inside Nextcloud, apps read stock theming CSS variables filled from the primary colour openDesk...
liferay-dxp: 57 changes
tokens-studio: 24 changes

Demand-signal rows added (36), by origin

Each row is rated in every column. thematiq is rated from its own code (built, reachedOn). Cells not re-read for a system say so in their evidence.

origin row thematiq nc-theming m365 opendesk liferay tokens-studio originUrl
tender gov-environment-marker no partial partial no partial no https://www.tenderned.nl/aankondigingen/overzicht/407031
tender sur-generated-documents no no partial partial unknown no https://www.tenderned.nl/aankondigingen/overzicht/404703
featureRequest sur-help-links no partial unknown partial unknown no nextcloud/server#58909
featureRequest sur-support-link no no partial partial yes no nextcloud/server#39047
featureRequest sur-localised-name no no yes partial yes no nextcloud/server#37550
featureRequest sur-login-wording no no yes partial yes no nextcloud/server#38831
featureRequest gov-enforce-appearance no partial partial no partial no nextcloud/server#38966
featureRequest sur-coverage-report no no partial no unknown no https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/work_items/27
featureRequest aut-dtcg-colour-objects partial no no no no partial tokens-studio/figma-plugin#3236
featureRequest aut-broken-reference-list yes no no no unknown partial tokens-studio/figma-plugin#3397
featureRequest cat-living-token-docs partial no unknown no partial partial tokens-studio/figma-plugin#3355
featureRequest app-simple-theme-switch yes partial yes no yes partial https://feedback.tokens.studio/p/theme-switcher-for-non-ds-designers
featureRequest aut-component-preview partial unknown unknown unknown no unknown https://liferay.atlassian.net/browse/LPD-88654
roadmap sco-suite-wide-appearance partial partial partial partial partial no https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/blob/v1.18.2/docs/baseline-requirements.md
roadmap int-brand-kit-in-editor no no yes partial partial no https://www.microsoft.com/microsoft-365/roadmap?id=566351
roadmap gov-lock-per-space partial no yes no partial no https://www.microsoft.com/microsoft-365/roadmap?id=526794
roadmap sur-assistant-logo no no yes no unknown no https://www.microsoft.com/microsoft-365/roadmap?id=555852
roadmap gov-no-public-cdn yes yes no yes yes yes https://www.microsoft.com/microsoft-365/roadmap?id=571391
roadmap ast-branded-reactions no no yes no no no https://www.microsoft.com/microsoft-365/roadmap?id=541830
roadmap sur-per-app-brand no no yes partial partial no https://www.microsoft.com/microsoft-365/roadmap?id=568364
roadmap app-branding-package partial unknown unknown unknown no unknown https://liferay.atlassian.net/browse/LPD-91941
roadmap acc-high-contrast-tokens no unknown unknown unknown no unknown https://liferay.atlassian.net/browse/LPD-90810
roadmap aut-add-token partial unknown unknown unknown partial unknown https://liferay.atlassian.net/browse/LPD-80283
changelog acc-toast-timeout no yes unknown no no no nextcloud/server#62689
changelog sur-selection-colour yes yes unknown partial unknown no nextcloud/server#58834
changelog ast-mobile-logo no no no yes unknown no https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/blob/v1.18.2/CHANGELOG.md
changelog gov-token-deprecation partial no no no unknown yes https://github.com/tokens-studio/figma-plugin/releases/tag/2.12.1
changelog syn-push-to-platform no no unknown no no yes https://github.com/tokens-studio/figma-plugin/releases/tag/2.11.9
changelog aut-dtcg-bulk-convert no no no no no yes https://github.com/tokens-studio/figma-plugin/releases/tag/2.12.0
changelog aut-motion-tokens partial no no no partial yes https://github.com/tokens-studio/figma-plugin/releases/tag/2.12.1
changelog typ-theme-base-size no no no unknown partial yes https://github.com/tokens-studio/figma-plugin/releases/tag/2.11.5
changelog sco-per-app-login no no partial no unknown no https://learn.microsoft.com/en-us/entra/fundamentals/whats-new
changelog sur-block-page no no partial no no no https://learn.microsoft.com/en-us/entra/fundamentals/whats-new
changelog gov-central-brand-library yes unknown unknown unknown yes unknown https://liferay.dev/b/liferay-dxp-2026-q3-release-webinar-replay
changelog aut-light-dark-values partial unknown unknown unknown partial unknown https://liferay.atlassian.net/browse/LPD-96942
changelog aut-alpha-hex partial unknown unknown unknown yes unknown https://learn.liferay.com/w/dxp/sites/site-appearance/style-books/using-a-style-book-to-standardize-site-appearance

The two TenderNed rows come from tender requirements in the intelligence database. gov-environment-marker (TenderNed 407031) asks for a visible difference between test and production. sur-generated-documents (TenderNed 404703) asks for generated letters and PDFs in the house style. thematiq has neither.

Notes on the mined rows:

  • A Tokens Studio candidate (theme switching for people who are not token specialists) was first held back as a near duplicate of cat-municipal-sets. It was then added as app-simple-theme-switch, because it is about the non-specialist route rather than the catalogue.
  • app-branding-package (Liferay roadmap LPD-91941) overlaps gov-otap-bundle. It is kept for the self-applying package angle, and thematiq is partial because font binaries are not embedded in the bundle.
  • aut-alpha-hex has origin changelog, but its originUrl is the style book documentation, because no Liferay release-notes page naming the change was found.
  • The Microsoft 365 roadmap originUrls (https://www.microsoft.com/microsoft-365/roadmap?id=<id>) were confirmed against Microsoft's own roadmap RSS feed (/releasecommunications/api/v2/M365/rss), whose <link> for each of the six ids has exactly that form. The page itself answered 403 to curl.

Sources objects

nextcloud-theming
{
 "docs": "https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/theming.html",
 "sourceRepo": "https://github.com/nextcloud/server/tree/v35.0.1/apps/theming (tag v35.0.1, commit 3c012e6)",
 "featurePage": "https://nextcloud.com/blog/branding-theming-nextcloud-hub/",
 "featureRequests": "https://github.com/nextcloud/server/issues?q=is%3Aissue+is%3Aopen+label%3A%22feature%3A+theming%22+label%3Aenhancement",
 "issueTracker": {
  "url": "https://github.com/nextcloud/server/issues?q=is%3Aissue+is%3Aopen+label%3A%22feature%3A+theming%22",
  "featureLabel": "feature: theming"
 },
 "roadmap": null,
 "changelog": [
  "https://github.com/nextcloud/server/releases/tag/v35.0.1",
  "https://nextcloud.com/changelog/"
 ],
 "apiReference": [
  "https://github.com/nextcloud/server/blob/v35.0.1/apps/theming/openapi.json",
  "https://docs.nextcloud.com/server/latest/developer_manual/client_apis/OCS/ocs-api-overview.html"
 ],
 "marketplace": "https://apps.nextcloud.com/apps/theming_customcss",
 "pricing": null,
 "accessibilityStatement": null,
 "securityDocs": "https://github.com/nextcloud/server/blob/v35.0.1/SECURITY.md",
 "demoInstance": "https://try.nextcloud.com/",
 "community": "https://help.nextcloud.com/",
 "reviews": null,
 "videos": "https://nextcloud.com/blog/webinar/webinar-branding-theming-nextcloud-hub/",
 "caseStudies": null,
 "partnerDirectory": null,
 "trainingCurriculum": null,
 "jobPostings": null,
 "tenders": [
  "opentender AT ocds-70d2nz-e3a2e012-3572-3e76-abe8-62471096b8de (Bundesministerium fuer Arbeit und Wirtschaft, Nextcloud Subscriptions, https://opentender.eu/at/tender/ocds-70d2nz-e3a2e012-3572-3e76-abe8-62471096b8de)",
  "opentender AT ocds-70d2nz-6ff0aa94-6e12-3651-b25e-efe4f4e7cd2e (Universitaet Innsbruck, Nextcloud Groupware Campus Lizenz, 2024-12-12, https://opentender.eu/at/tender/ocds-70d2nz-6ff0aa94-6e12-3651-b25e-efe4f4e7cd2e)"
 ],
 "nullReasons": {
  "roadmap": "2026-09-26: no public roadmap found; github.com/nextcloud/roadmap returns 404 and nextcloud.com could not be reached from this sandbox (connection refused), so a roadmap page there was not checked",
  "pricing": "2026-09-26: theming is free in the AGPL server; nextcloud.com/pricing could not be reached from this sandbox (connection refused), so enterprise branding prices were not read",
  "accessibilityStatement": "2026-09-26: nextcloud.com/accessibility could not be reached (connection refused); no accessibility statement file in the v35.0.1 source tree",
  "reviews": "2026-09-26: g2.com/products/nextcloud/reviews returned 403; no other review source checked",
  "caseStudies": "2026-09-26: nextcloud.com/customers could not be reached (connection refused); no theming-specific case study found in web search",
  "partnerDirectory": "2026-09-26: nextcloud.com/partners could not be reached (connection refused)",
  "trainingCurriculum": "2026-09-26: nextcloud.com/training could not be reached (connection refused); the admin manual theming page is the only training material found",
  "jobPostings": "2026-09-26: nextcloud.com/jobs could not be reached (connection refused); not relevant to a shipped server component"
 },
 "notes": {
  "featurePage": "URL found by web search on 2026-09-26; nextcloud.com itself refused connections from this sandbox, so its current content was not read",
  "changelog": "GitHub release list read with gh; nextcloud.com/changelog found by web search but not loadable here",
  "marketplace": "theming_customcss is a separate App Store app that adds a custom CSS field; it is not part of the built-in theming app",
  "videos": "found by web search 2026-09-26, not loaded"
 }
}
m365-branding
{
 "docs": [
  "https://learn.microsoft.com/en-us/entra/fundamentals/how-to-customize-branding",
  "https://learn.microsoft.com/en-us/microsoft-365/admin/setup/customize-your-organization-theme",
  "https://learn.microsoft.com/en-us/sharepoint/brand-center-overview",
  "https://learn.microsoft.com/en-us/sharepoint/dev/declarative-customization/site-theming/sharepoint-site-theming-overview",
  "https://learn.microsoft.com/en-us/microsoftteams/meeting-themes"
 ],
 "sourceRepo": null,
 "featurePage": "https://learn.microsoft.com/en-us/sharepoint/brand-center-overview",
 "featureRequests": "https://feedbackportal.microsoft.com/",
 "issueTracker": null,
 "roadmap": "https://www.microsoft.com/microsoft-365/roadmap",
 "changelog": [
  "https://learn.microsoft.com/en-us/entra/fundamentals/whats-new",
  "https://learn.microsoft.com/en-us/entra/fundamentals/whats-new-archive"
 ],
 "apiReference": [
  "https://learn.microsoft.com/en-us/graph/api/resources/organizationalbranding?view=graph-rest-1.0",
  "https://learn.microsoft.com/en-us/sharepoint/dev/declarative-customization/site-theming/sharepoint-site-theming-rest-api",
  "https://learn.microsoft.com/en-us/sharepoint/dev/declarative-customization/site-theming/sharepoint-site-theming-powershell"
 ],
 "marketplace": null,
 "pricing": null,
 "accessibilityStatement": null,
 "securityDocs": "https://learn.microsoft.com/en-us/entra/architecture/security-operations-introduction",
 "demoInstance": null,
 "community": [
  "https://techcommunity.microsoft.com/category/microsoft-entra",
  "https://techcommunity.microsoft.com/category/sharepoint",
  "https://learn.microsoft.com/en-us/answers/tags/455/entra-id"
 ],
 "reviews": null,
 "videos": "https://learn.microsoft.com/en-us/shows/",
 "caseStudies": null,
 "partnerDirectory": null,
 "trainingCurriculum": "https://learn.microsoft.com/en-us/credentials/certifications/identity-and-access-administrator/",
 "jobPostings": "https://jobs.careers.microsoft.com/global/en/search?q=branding",
 "tenders": [
  "130 tenders in the intelligence database carry a requirement naming Microsoft 365 or Office 365 (integration, not branding); two tie it to house style: TenderNed 399455 (Zaaksysteem, https://www.tenderned.nl/aankondigingen/overzicht/399455) and TenderNed 415112 (Leermanagementsysteem, https://www.tenderned.nl/aankondigingen/overzicht/415112)"
 ],
 "nullReasons": {
  "sourceRepo": "closed source: Entra ID, Microsoft 365 and SharePoint Online are proprietary hosted services; the only related repo is the community tool github.com/microsoft/Microsoft365DSC, not the product (checked 2026-09-26)",
  "issueTracker": "no public issue tracker for these services; defects go through admin-center support requests, and feature ideas through feedbackportal.microsoft.com (checked 2026-09-26)",
  "marketplace": "no theme marketplace; appsource.microsoft.com (apps, not themes) returned 403 to curl on 2026-09-26",
  "pricing": "not verified: www.microsoft.com Entra and Microsoft 365 pricing pages returned 403 to curl on 2026-09-26; licence prerequisites (Entra ID P1/P2, M365 Business Standard, SharePoint Plan 1, Teams Premium) are stated in the feature docs",
  "accessibilityStatement": "not verified: https://www.microsoft.com/en-us/accessibility/conformance-reports returned 403 to curl on 2026-09-26, and no branding-specific accessibility statement was found on learn.microsoft.com",
  "demoInstance": "none: no public demo tenant; trial accounts were out of scope for this read (2026-09-26)",
  "reviews": "not verified: Gartner Peer Insights and G2 pages returned 403 to curl on 2026-09-26",
  "caseStudies": "not verified: customers.microsoft.com and www.microsoft.com/en-us/customers returned 403 to curl on 2026-09-26",
  "partnerDirectory": "not verified: partner.microsoft.com find-a-partner timed out and appsource partner directory returned 403 on 2026-09-26"
 }
}
opendesk
{
 "docs": [
  "https://docs.opendesk.eu/operations/theming/",
  "https://docs.opendesk.eu/"
 ],
 "sourceRepo": "https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk (tag v1.18.2, commit eab2ee7; also read opendesk-nextcloud chart v4.10.6, opendesk-nextcloud image v2.17.2, opendesk-jitsi chart v3.10.0, opendesk-impress-customization v1.0.0 under gitlab.opencode.de/bmi/opendesk/components/platform-development/)",
 "featurePage": "https://www.opendesk.eu/en/product",
 "featureRequests": "https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/issues/?label_name%5B%5D=type%3A%20Improvement",
 "issueTracker": {
  "url": "https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/issues",
  "featureLabel": "type: Improvement (feature requests also use the 'Feature Request' issue template)"
 },
 "roadmap": "https://www.opendesk.eu/en/roadmap",
 "changelog": "https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/blob/v1.18.2/CHANGELOG.md",
 "apiReference": "https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/blob/v1.18.2/docs/architecture/apis.md",
 "marketplace": null,
 "pricing": null,
 "accessibilityStatement": [
  "https://docs.opendesk.eu/legal/barrierefreiheit/",
  "https://www.opendesk.eu/en/accessibility"
 ],
 "securityDocs": [
  "https://docs.opendesk.eu/operations/security/",
  "https://docs.opendesk.eu/legal/it-grundschutz/"
 ],
 "demoInstance": "https://portal.demo.opendesk.eu/univention/portal/",
 "community": "https://gitlab.opencode.de/bmi/opendesk",
 "reviews": null,
 "videos": null,
 "caseStudies": null,
 "partnerDirectory": "https://www.opendesk.eu/en/partner-werden",
 "trainingCurriculum": null,
 "jobPostings": "https://www.zendis.de/karriere",
 "tenders": null,
 "nullReasons": {
  "marketplace": "openDesk ships as a helmfile deployment; opendesk.eu/en and docs.opendesk.eu link no app store or marketplace listing, and it is not a Nextcloud app store app (searched 2026-09-26)",
  "pricing": "https://www.opendesk.eu/en/operating-models (read 2026-09-26) describes Enterprise and Community editions and operating models but publishes no prices",
  "reviews": "no review platform linked from opendesk.eu or docs.opendesk.eu; not searched on third-party review sites (2026-09-26)",
  "videos": "opendesk.eu/en footer links LinkedIn, GitLab, opencode.de and docs only; no video channel found (2026-09-26)",
  "caseStudies": "opendesk.eu/en has a blog (news, partner programme, security incident) but no case study section (2026-09-26)",
  "trainingCurriculum": "docs.opendesk.eu has user and admin guides (/user/overview/erste-schritte/, /administration/erste-schritte/) but no training curriculum; searched site navigation 2026-09-26",
  "tenders": "intelligence database searched 2026-09-26: no tender name, description or requirement mentions openDesk"
 },
 "notes": {
  "roadmap": "page exists but lists no items: 'We are currently coordinating our upcoming development cycles. More information about future releases will be available here shortly.' (read 2026-09-26)",
  "demoInstance": "https://demo.opendesk.eu/ redirects to the portal login; https://www.opendesk.eu/en/demo-session books a guided demo",
  "docs": "docs.opendesk.eu/operations/theming/ renders docs/theming.md, whose link to portalStylesheets.css names a file that does not exist at v1.18.2"
 }
}
liferay-dxp
{
 "docs": "https://learn.liferay.com/w/dxp",
 "sourceRepo": "https://github.com/liferay/liferay-portal/tree/2026.q3.0 (LGPL source per https://liferay.dev/b/one-platform-one-liferay-the-2026-release-model; tag 2026.q3.0 exists; this column was rated from public docs, the source was not read)",
 "featurePage": "https://learn.liferay.com/w/dxp/sites/site-appearance/style-books",
 "featureRequests": "https://liferay.atlassian.net/jira/software/c/projects/LPD/issues",
 "issueTracker": {
  "url": "https://liferay.atlassian.net/jira/software/c/projects/LPD/issues",
  "featureLabel": "issue types Epic, Story and Spike in project LPD (no separate feature label; the public REST search /rest/api/3/search/jql works anonymously)"
 },
 "roadmap": "https://www.liferay.com/roadmap",
 "changelog": [
  "https://liferay.dev/b/liferay-dxp-2026-q3-release-webinar-replay",
  "https://learn.liferay.com/w/dxp/self-hosted-installation-and-upgrades/upgrading-liferay/deprecations-and-breaking-changes-reference/2026-deprecations-and-breaking-changes/2026-q3-default-setting-and-feature-flag-changes",
  "https://liferay.dev/b/liferay-dxp-2026-q2-is-now-available-"
 ],
 "apiReference": "https://learn.liferay.com/w/dxp/integration/headless-apis",
 "marketplace": "https://marketplace.liferay.com/",
 "pricing": "https://www.liferay.com/pricing",
 "accessibilityStatement": [
  "https://www.liferay.com/accessibility-compliance/digital-experience-platform",
  "https://www.liferay.com/documents/d/guest/vpat2-5rev_int_february2025_liferay_dxp_sites_experience"
 ],
 "securityDocs": "https://learn.liferay.com/w/dxp/security-and-administration/security",
 "demoInstance": "https://learn.liferay.com/w/dxp/getting-started/liferay-dxp-free-tier",
 "community": [
  "https://liferay.dev/",
  "https://liferay.dev/ask"
 ],
 "reviews": null,
 "videos": "https://www.youtube.com/@liferay",
 "caseStudies": "https://www.liferay.com/resources/case-studies",
 "partnerDirectory": "https://www.liferay.com/partners",
 "trainingCurriculum": "https://learn.liferay.com/education/index",
 "jobPostings": "https://www.liferay.com/careers",
 "tenders": [
  "34 tenders name Liferay, all Spanish PLACSP portal maintenance or subscription renewals, e.g. ES-PLACSP-19525683 (renewal of Liferay DXP subscription and support, https://contrataciondelestado.es/wps/poc?uri=deeplink:detalle_licitacion&idEvl=0sX1dCzTZxzECtSnloz%2BZQ%3D%3D) and ES-PLACSP-19931298 (2026-07-16)"
 ],
 "nullReasons": {
  "reviews": "2026-09-26: https://www.g2.com/products/liferay-dxp/reviews returned 403 to a plain request and no other review site was checked, so no review page was confirmed"
 },
 "notes": "www.liferay.com pages answer a bot challenge to curl on 2026-09-26; roadmap, pricing, accessibility, case studies, partners and careers URLs were confirmed by web search results or HTTP status, not by reading the page body; demoInstance is the free tier self-install, Liferay offers no public demo instance"
}
tokens-studio
{
 "docs": [
  "https://docs.tokens.studio/",
  "https://documentation-v2.tokens.studio/"
 ],
 "sourceRepo": "https://github.com/tokens-studio/figma-plugin/tree/2.12.1 (tag 2.12.1, commit a28cadd)",
 "featurePage": "https://tokens.studio/studio-platform",
 "featureRequests": [
  "https://feedback.tokens.studio/",
  "https://github.com/tokens-studio/figma-plugin/issues?q=is%3Aopen+label%3A%22%F0%9F%92%A1request%22"
 ],
 "issueTracker": {
  "url": "https://github.com/tokens-studio/figma-plugin/issues",
  "featureLabel": "💡request"
 },
 "roadmap": "https://feedback.tokens.studio/roadmap",
 "changelog": [
  "https://github.com/tokens-studio/figma-plugin/blob/2.12.1/packages/tokens-studio-for-figma/CHANGELOG.md",
  "https://github.com/tokens-studio/figma-plugin/releases"
 ],
 "apiReference": "https://tokens-studio.github.io/studio-app/",
 "marketplace": "https://www.figma.com/community/plugin/843461159747178978/tokens-studio-for-figma",
 "pricing": "https://tokens.studio/pricing",
 "accessibilityStatement": null,
 "securityDocs": null,
 "demoInstance": "https://tokens.studio/trial",
 "community": [
  "https://tokens.studio/slack",
  "https://github.com/tokens-studio/figma-plugin/discussions"
 ],
 "reviews": null,
 "videos": [
  "https://www.youtube.com/@tokensstudio"
 ],
 "caseStudies": null,
 "partnerDirectory": null,
 "trainingCurriculum": "https://tokens.studio/coaching",
 "jobPostings": null,
 "tenders": null,
 "nullReasons": {
  "accessibilityStatement": "searched tokens.studio nav links, tokens.studio/accessibility (404) and both doc sites for accessib/wcag on 2026-09-26: none published",
  "securityDocs": "tokens.studio/security and /trust return 404 and the docs nav has no security page on 2026-09-26; pricing only lists 'Security & Compliance support' in the Organization plan",
  "reviews": "G2 (g2.com/products/tokens-studio/reviews) returned 403 to a scripted read on 2026-09-26; no other review site found",
  "caseStudies": "tokens.studio/case-studies and /customers return 404 on 2026-09-26; the homepage has only a logo wall",
  "partnerDirectory": "tokens.studio/partners returns 404 on 2026-09-26; pricing says an agency partner programme is being worked on",
  "jobPostings": "tokens.studio/jobs redirects to careers.tokens.studio, which did not answer (no connection) on 2026-09-26",
  "tenders": "intelligence database searched 2026-09-26: no tender name, description or requirement mentions Tokens Studio"
 }
}

openDesk live-defect candidates (code readings, each needs a live check)

  • The Jitsi inverted header logo is blank. opendesk@v1.18.2 helmfile/environments/default/theme.yaml.gotmpl:53 defines logoHeaderInvertedSvg after the 1.18 rename (docs/migrations-manual.md:416-430). But opendesk-jitsi@v3.10.0 charts/opendesk-jitsi/templates/configmap.yaml:20 still reads logoHeaderInvertedSvgB64, so Jitsi falls back to its 1x1 blank default (values.yaml:714).
  • logoHeaderInvertedSvg has no consumer. grep -rn logoHeaderInverted helmfile/apps finds nothing, so the dark or inverted logo is configurable but reaches no component.
  • Several colour tokens are unused. The status colours (secondaryRed, secondaryYellow, secondaryGreen) and secondaryBlueHighcontrast (theme.yaml.gotmpl:39-46) are marked 'Not in use yet' by openDesk itself and have no consumer. An admin who sets them sees no effect.

Where the method was harder

  • Grade. The grade enum has no value for a source read, so three columns read from source at a tag are graded docs-only, the same as the two closed ones. The difference lives only in the evidence strings and readNote.
  • Nextcloud clone. The Nextcloud server clone was sparse (apps/theming, settings, admin_audit, core, lib/private/Mail). Nextcloud Office (richdocuments), Talk and the Assistant are separate apps and were not read. The nextcloud-theming no cells for int-brand-kit-in-editor, sur-assistant-logo and ast-branded-reactions say that they cover server and the theming app only.
  • openDesk layers. openDesk is configuration as code across a deployment repo plus per-component charts and images, each on its own tag. A capability is often declared in the values tree with no consumer, so every opendesk cell had to trace the value into a component chart before it counted. The bundled Nextcloud is 33.0.9 in openDesk against 35.0.1 in the nextcloud-theming column, so the same stock behaviour was read at two versions.
  • Tokens Studio. Tokens Studio is a Figma plugin plus a paid platform. Many rows are no: outside the product from the plugin manifest, and platform-only capabilities could only be rated from docs. Four cells went from no to unknown (ast-upload-logo, ast-upload-background, ast-brand-images, acc-keyboard-admin). In the first three the plugin cannot do it, but the platform advertises asset management. The fourth needs a keyboard drive of the plugin UI.
  • Microsoft 365. microsoft.com answered 403 to scripted reads, so roadmap items were read from Microsoft's roadmap feed, and six sources fields are null with the 403 recorded as the reason.
  • Liferay. www.liferay.com answered a bot challenge, so its roadmap, pricing, accessibility, case-study, partner and careers fields are confirmed by status code or search result, not by reading the page. Several Liferay ratings rest on public LPD Jira issues rather than product docs, and the readNote says so. Liferay's portal source is public on GitHub (tag 2026.q3.0), but this column was rated from docs only.
  • Closed systems. For m365-branding and liferay-dxp a no needs the docs to state or imply the absence. That left 32 and 24 unknowns.
  • Labs. No lab was booted in this wave: the relaunched lane ran without labs. So no images were pulled, and there is no market-intelligence lab PR. Rows that only a live drive could settle stay unknown with that reason.

@rubenvdlinde
rubenvdlinde merged commit fd9e662 into development Sep 26, 2026
32 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/thematiq @ 7f7da96

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
check-manifest ✅
test-l10n ✅
format ✅
composer ✅ ✅ 107/107
npm ✅ ✅ 2/2
app:check-code ⏭️
info.xml ✅
REUSE ✅
lockfile sync ✅
PHPUnit ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it.
Newman ✅
Playwright ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it on any branch from the Actions tab, or locally with npx playwright test.
Hydra gates ✅

Quality workflow — 2026-09-26 14:18 UTC

Download the full PDF report from the workflow artifacts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant