Skip to content

fix(ontology): preserve singleton relations across export pages - #934

Draft
seonghobae wants to merge 6 commits into
fix/voice-export-authority-20260828from
codex/voice-gap-20260905
Draft

fix(ontology): preserve singleton relations across export pages#934
seonghobae wants to merge 6 commits into
fix/voice-export-authority-20260828from
codex/voice-gap-20260905

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Continuing a neighborhood must not overwrite earlier direct JSON-LD relationships when either page represents a property as a singleton. Preserve all values for a repeated subject, including types, labels, and multi-Voice links. ADR 0256 clarifies the existing export-parity contract; authorization, carrying/derivation evidence, and cutoff semantics remain unchanged.

Current review/repair lineage: review 5120376842 found that raw JSON.stringify(value) treated JSON object member order as identity even though RFC 8259 defines JSON objects as unordered and JSON-LD node/value objects may serialize equivalent members in different orders. RED 6beed92b43f23b95131419641563918750e3fc3b adds a continuation regression with an equivalent JSON-LD value object whose members are reversed. Causal repair eae1e7286073761283b8ac3642b06b3ea4417e64 uses a recursive structural key that sorts object keys while preserving array sequence. Documentation convergence 3060dd7000791160c2bcc98351af129899ff32ff records that precise boundary in ADR 0256 and adds RFC 8259 plus the W3C JSON-LD 1.1 Recommendation to traceability. Compare from prior head 7ed5a417fab667e5954ec14c29a3716dae305330 is exactly three commits touching ADR 0256, the new regression, and frontend/src/ontologyLayout.ts.

Earlier validation on predecessor heads recorded focused frontend tests, lint, TypeScript, production build, ontology/SHACL/API tests, real Keycloak/JWKS with migrated synthetic PostgreSQL, Storybook desktop/mobile inspection, and a synthetic authenticated k6 observation of p95 25.88 ms. Those observations are predecessor evidence only and are not promoted to exact-head GREEN for 3060dd7000791160c2bcc98351af129899ff32ff.

Review 5120950873 found a governance/capacity mismatch: this child was Ready while still stacked on unmerged #780, so repository-local work was queued for a head that could not yet merge normally. The PR was returned to Draft without changing the product tree. On the same exact head, predecessor Ready-trigger Tests 33953919411 completed cancelled; the Draft-transition Tests run 33962248937 completed skipped. This proves lifecycle cancellation/admission only and is not product GREEN.

Stacked on #780 (1d8fa267b059289e77301a09985dfac70a439814). Keep Draft until #780 merges through normal protected governance; then retarget/converge this child non-force to protected main and collect fresh exact-head/base checks plus qualifying independent review. Child #935 remains Draft behind this branch. No schema or release number is added here. Full authenticated deployed additional-Voice/cutoff acceptance remains unavailable.

@coderabbitai

coderabbitai Bot commented Sep 5, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Team

Run ID: 1e9c8b81-301c-4385-b15e-9a84c7c7dfaa

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae
seonghobae marked this pull request as ready for review September 5, 2026 07:34

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

accumulateNeighborhoodPages() now preserves singleton/array values, but its dedup key is raw JSON.stringify(value). JSON object member order is not semantic identity (RFC 8259 defines objects as unordered), and JSON-LD value/node objects can legitimately arrive with the same members in a different order. In that case continuation pages retain a duplicate even though this PR/ADR promises repeated values are deduplicated. Please pin this with a regression using the same JSON-LD object with reversed member order, then use an order-insensitive structural key for deduplication while preserving array order.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current-stack governance finding: this head is still based on unmerged #780 (1d8fa267…) while the PR is Ready, so repository-local validation is consuming/queuing capacity for a child that cannot be normally merged yet. This conflicts with the parent-first/Draft-dependent contract already stated in the PR body. Keep the valid JSON-LD repair intact, return this child to Draft now, let the lifecycle cancellation event retire the queued repository-local work, and only re-enter Ready after #780 lands and this branch is non-force converged/retargeted to protected main. No predecessor GREEN transfers.

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant