Skip to content
This repository was archived by the owner on May 29, 2026. It is now read-only.

feat(openspec): four OR abstraction specs from the 2026-05-03 audit#1420

Merged
rubenvdlinde merged 1 commit into
developmentfrom
feat/openspec-or-abstraction-specs
May 3, 2026
Merged

feat(openspec): four OR abstraction specs from the 2026-05-03 audit#1420
rubenvdlinde merged 1 commit into
developmentfrom
feat/openspec-or-abstraction-specs

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Summary

Phase 2 of the OR-abstraction audit (2026-05-03). Four openspec changes implementing the audit's top hardcoded-functionality findings + ADR-019 + ADR-025.

  • register-resolver-service/ — Publishable RegisterResolverService that absorbs the getValueString(...register/schema...) pattern duplicated across 13 call sites (opencatalogi 5, pipelinq 8, docudesk). 5 public methods + request-scoped caching + multi-tenant scoping + 3 structured exceptions + admin diagnostics.
  • pluggable-integration-registry/ — Implements hydra ADR-019. Two-sided registry (PHP interface + JS register call), DI-tag auto-registration, migrates 8 built-in NC types away from LinkedEntityService::TYPE_COLUMN_MAP, external providers via OpenConnector, OCS capability surface, CI parity gate.
  • i18n-source-of-truth/ — Implements hydra ADR-025 (DB/schema/render half). Schema sourceLanguage modifier, Translation.source_language column, _meta.languageMeta render envelope, X-Source-Language response header, automatic outdated-status flip on source-value change.
  • i18n-api-language-negotiation/ — Implements hydra ADR-025 (API contract half). ?_lang= / ?language= query params with explicit precedence, lax fallback (no 406), write-side X-Translation-Target-Language header, conflict body+header → 400.

Test plan

  • No code changes; doc-only openspec change.
  • References resolve: ADR-019 + ADR-022 + ADR-025 in hydra/openspec/architecture/; audit research at .claude/audit-2026-05-03/research/R4-*.md + R5-*.md + 04-hardcoded.md.
  • Each change includes proposal/tasks/design/spec — full opsx artefact set.
  • All four cite the same canonical audit report so future readers can trace findings → specs.

Sequencing

Each change has its own implementation track (Phase 4 of the audit follow-up). The two i18n changes share a migration but otherwise decouple; they can ship in either order. Consumer apps' adoption changes ({app}-adopt-manifest, {app}-adopt-or-abstractions) cite these specs by their merged slugs.

Stats

16 files, 1,979 lines of openspec content.

Adds four openspec changes implementing the audit's top hardcoded-
functionality findings + ADR-019 + ADR-025.

- openspec/changes/register-resolver-service/ (4 files, 560 lines)
  publishable RegisterResolverService that absorbs the
  `getValueString(...register/schema...)` pattern duplicated across
  13 call sites in opencatalogi (5 controllers), pipelinq (8
  services/jobs), and docudesk (OpenRegisterResolver). Five public
  methods (resolveRegisterId/SchemaId/Register/Schema/Pair),
  request-scoped caching, multi-tenant scoping via MultiTenancyTrait,
  three structured exceptions (MissingConfig / RegisterNotFound /
  SchemaNotFound), enumerateAppConfigs() for admin tooling.

- openspec/changes/pluggable-integration-registry/ (4 files, 472 lines)
  Implements hydra ADR-019 — two-sided integration registry.
  IntegrationProvider PHP interface + IntegrationRegistry service
  + DI tag auto-registration; migrates the 8 built-in NC types
  (files/notes/tasks/calendar/mail/contacts/deck/talk) from the
  hardcoded `LinkedEntityService::TYPE_COLUMN_MAP`; routes external
  providers through OpenConnector; advertises capabilities via OCS;
  CI parity gate ensures backend ↔ frontend pairing.

- openspec/changes/i18n-source-of-truth/ (4 files, 510 lines)
  Implements hydra ADR-025 (source-of-truth half). Adds
  `sourceLanguage` schema-property modifier + per-object override
  via `_translationMeta` + new `source_language` column on
  openregister_translations + render envelope `_meta.languageMeta`
  + `X-Source-Language` response header + automatic outdated-status
  flip on source-value change. Closes the gap from audit R4.

- openspec/changes/i18n-api-language-negotiation/ (4 files, 437 lines)
  Implements hydra ADR-025 (API contract half). Adds `?_lang=` /
  `?language=` query params with explicit precedence over
  Accept-Language, lax fallback (no 406), and a write-side
  `X-Translation-Target-Language` header for scalar-body PATCH/PUT
  to non-default languages. Conflicting body+header → 400.

References:
.claude/audit-2026-05-03/research/R4-or-i18n-source-of-truth.md
.claude/audit-2026-05-03/research/R5-or-api-language-negotiation.md
.claude/audit-2026-05-03/04-hardcoded.md (top-10 findings #1-#10)
hydra/openspec/architecture/adr-019-integration-registry.md
hydra/openspec/architecture/adr-022-apps-consume-or-abstractions.md
hydra/openspec/architecture/adr-025-i18n-source-of-truth.md
@rubenvdlinde rubenvdlinde merged commit 013d22f into development May 3, 2026
14 checks passed
@rubenvdlinde rubenvdlinde deleted the feat/openspec-or-abstraction-specs branch May 3, 2026 14:15
rubenvdlinde added a commit that referenced this pull request May 3, 2026
…doption (#1422)

Phase 3 of the OR-abstraction audit (2026-05-03). Spec-only — no
code changes. Drafts the per-app adoption openspec change so each
app can run /opsx-apply against it when ready.

References .claude/audit-2026-05-03/ research, Phase 2 OR/nc-vue/
hydra specs (#1420, #113, #218), and ADRs 022/024/025.
@github-actions

github-actions Bot commented May 3, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/openregister @ 1370d0a

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 147/147
npm ✅ 598/598
PHPUnit
Newman
Playwright ⏭️

Quality workflow — 2026-05-03 20:23 UTC

Download the full PDF report from the workflow artifacts.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant