Skip to content

fix(magic-tables,example-sets): underscore properties read as properties, dot-path config fields, check counts like install - #4661

Merged
rubenvdlinde merged 2 commits into
developmentfrom
fix/g4-zuiddrecht-r2-findings
Oct 16, 2026
Merged

rubenvdlinde merged 2 commits into
developmentfrom
fix/g4-zuiddrecht-r2-findings

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Findings from the Zuiddrecht go-live rehearsal R2 (NC 32.0.13, openregister 2.1.41-unstable.20261015192032).

16,038x "[MagicStatisticsHandler] meta is not a valid attribute". shillinq declares a property _meta (RetentionRule, BbvAccountMapping, InnovatieboxTariff). Its magic-table column is _meta, and every reader took each _ column for object metadata: MagicStatisticsHandler called ObjectEntity::setMeta(), which throws, and dropped the whole row; MagicSearchHandler and MagicMapper::rowToObjectEntity() silently dropped the property; the bulk writer never wrote it. MagicMetadataColumn now decides: a property the schema declares is a property, unless ObjectEntity has an attribute of that name. An unknown metadata column is skipped and logged at debug once per field (the legitimate-skip case), and _schema_version reaches schemaVersion. This was a data fault, not only noise: those rows were unreadable through that path.

opencatalogi PARTIAL IMPORT: publiccode rejected. Log: "None of the fallback fields in objectDescriptionField ('description.nl.longDescription | description.en.longDescription') exist as properties in the schema." The reader walks dot paths (MetadataHydrationHandler::getValueFromPath(), and Schema documents these fields as dot-notation paths), but the save-time check compared the whole path with the top-level keys. It now accepts a path whose first segment is a property. The opencatalogi schema is right, so no opencatalogi change is needed.

example-set:install zuiddrecht --check said 12 dossiq cases where the install declares 10. The check counted the set's two changes on dossiq case (parkeren-henk-uitkomst, woo-zaaksysteem-uitkomst) into the object count. REQ-EXS-004 asks for objects per register and schema, so the install was right. Changes are now counted apart and printed as dossiq case: 2 change(s) checked.

OpenSpec: new change underscore-properties-and-config-paths (REQ-MTR-001, REQ-SCP-001); example-sets REQ-EXS-004 gains a scenario.

Not here, on purpose: "GenericDeepLinkRegistrationListener: Could not resolve appId!" is caused by decidiq registering the listener under OpenRegister's class name; fixed in ConductionNL/decidiq#1747.

Verified locally: new tests with controls (each fails without its fix; a path into a missing property and an unknown metadata column still behave as before), tests/Unit/Service/ExampleSet and tests/Unit/Db green apart from 15 inherited SQLite-migration errors in AuditTrail tests that need a Nextcloud root. composer check:strict run once: lint, phpcs, psalm, phpstan green; phpmd flagged five findings in this change (static access, a long name, method length), fixed in the second commit and checked with phpmd and phpstan on the touched files; test:all red only on the 15 inherited SQLite-migration AuditTrail errors (they need a Nextcloud root and are not touched here). No _rbac added.

…roperty, and a config field may be a dot path

The rehearsal R2 install logged 16,038 'meta is not a valid attribute' errors:
shillinq's _meta property has a _meta column, and every magic-table reader
took each _ column for object metadata, so MagicStatisticsHandler failed the
whole row and the other readers dropped the property. MagicMetadataColumn now
decides: a property the schema declares is a property unless ObjectEntity has
that attribute. An unknown metadata column is skipped and noted once at debug.

opencatalogi's publiccode schema was rejected on every import because the
save-time check compared description.nl.longDescription with the top-level
keys; the reader walks dot paths, so the check now accepts a path whose first
segment is a property.

example-set --check counted changes into the per-schema object count (12 dossiq
cases against 10 declared); changes are now counted and printed apart.
… bulk writer asks it too

check:strict's phpmd flagged static access, a long variable name and the
bulk writer's method length; the write-side rule moves into
MagicMetadataColumn::skippedOnWrite().
@rubenvdlinde
rubenvdlinde merged commit f474f0d into development Oct 16, 2026
48 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/openregister @ 26a357d

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
check-specs ✅
test-l10n ✅
test-l10n-parity ✅
format ✅
check-schema-l10n ✅
composer ✅ ✅ 173/173
npm ✅ ✅ 648/648
app:check-code ⏭️
info.xml ✅
REUSE ✅
lockfile sync ✅
PHPUnit ✅ 26244/26244 · 25 skipped
Newman ✅ 714/714
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 locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development.
Hydra gates ✅

Quality workflow — 2026-10-16 00: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