Skip to content

feat(dpp)!: count how many of a group of properties a document sets (countPresent, PV14) - #5332

Merged
QuantumExplorer merged 3 commits into
v5.0-devfrom
claude/document-property-cardinality-98ff28
Oct 8, 2026
Merged

QuantumExplorer merged 3 commits into
v5.0-devfrom
claude/document-property-cardinality-98ff28

Conversation

@QuantumExplorer

@QuantumExplorer QuantumExplorer commented Oct 8, 2026 •

Copy link
Copy Markdown
Member

Basic explanation

What this does: A data contract can already set rules on a document type, such as "this property must be present". This adds countPresent, a way to count how many properties from a chosen group a document actually fills in. A rule can then say "exactly one of email, phone or handle", "at most two of these five", "at least one" or "one or two".

Value: Contract authors get a short, readable way to express "pick one of these" and "at most / at least n of these". Before, this needed one clause for every pair of properties. That was 17 rule nodes for three properties, and the 32-node limit was passed at five. Now it costs one node plus one per property: 6 nodes for "exactly one of three".

Risks: Low. It is a new keyword inside the protocol version 14 grammar, which is not live on mainnet. Earlier meta-schemas never accepted the key, so no stored contract can contain it, and existing rules are evaluated exactly as before. It reads only the document being written, never faults (no overflow or division), and is held to the existing node limit. It is consensus-relevant: nodes must agree on accepting contracts that use it and on judging documents against it, hence the !.

Issue being fixed or feature implemented

propertyConstraints could test one property at a time with present and absent, but could not bound how many of a group of properties a document sets. Writing "exactly one of N" by hand means an anyOf plus a not of every pair, which grows with the square of N and does not fit the rule limits beyond four properties. "At least k of N" for k of 2 or more needs every combination and is impractical.

What was done?

  • New integer expression countPresent (ConstraintExpression::CountPresent): how many of two or more distinct property paths the document holds, each counted exactly as present tests it (null and an object with no member present count as absent; 0 and false count as present). It works on properties of any type, nested ones and $old. paths included, and is never a fault.
  • Bounds come from the existing grammar: equal, lessThanOrEqual, greaterThanOrEqual and in. "Between 1 and 2" is { "in": [{ "countPresent": [...] }, [1, 2]] }, so no between operator was added.
  • Parsing: two or more paths are required, each a string, with no repeats. A repeat is refused on every parse (as an in refuses a repeated value) and by the meta-schema's uniqueItems at registration.
  • Path checks: each path is reported as a presence read, so parser generation 3 checks it like a present test: it must be a declared property, not transient and not a system value.
  • Node cost: one node plus one per path, counted against max_property_constraint_nodes.
  • Meta-schema v3: the countPresent key is added to the expression object, and the expression and path descriptions mention it.
  • Docs: a new "How many of a group" section in book/src/contract-keywords/property-constraints.md with a table of bounds, a row in the keyword table, a bullet on the deep-dive page and a mention in the js-evo-sdk README. Protocol version 14 note 39 is extended in place.
  • Bindings: the wasm-dpp2 TypeScript type gains { countPresent: string[] }. The Swift and Kotlin changes are doc comments only: each counted path already reaches them as a presence read.

Example

A seller must give exactly one way to be reached:

"propertyConstraints": {
  "oneContact": { "equal": [{ "countPresent": ["email", "phone", "handle"] }, 1] }
}

Before, registering this contract failed at the meta-schema (countPresent was not an allowed key), and the parser named it as unknown:

names "countPresent", which is not one of add, subtract, multiply, divide, modulo, power, min, max, abs, ifAbsent, length, byteLength, count, countOf or sumOf

The only way to say it was the pairwise form, 17 nodes for three properties:

"oneContact": { "allOf": [
  { "anyOf": [{ "present": "email" }, { "present": "phone" }, { "present": "handle" }] },
  { "not": { "allOf": [{ "present": "email" }, { "present": "phone" }] } },
  { "not": { "allOf": [{ "present": "email" }, { "present": "handle" }] } },
  { "not": { "allOf": [{ "present": "phone" }, { "present": "handle" }] } }
] }

Now the short form registers (6 nodes), and documents are judged like this:

Document sets Result
nothing refused, DocumentPropertyConstraintViolatedError (10422), rule oneContact
email accepted
email and phone refused (10422)
replace adding handle to an offer with email refused (10422)
replace removing email and setting handle accepted

Other bounds:

Want Rule
at most one { "lessThanOrEqual": [{ "countPresent": [...] }, 1] }
at least two { "greaterThanOrEqual": [{ "countPresent": [...] }, 2] }
one or two { "in": [{ "countPresent": [...] }, [1, 2]] }
none or all three { "in": [{ "countPresent": ["a", "b", "c"] }, [0, 3]] }

In-place changes to shipped generations

Meta-schema v3 and document type parser generation 3 are edited in place. Only protocol version 14 selects them, and it is not live on mainnet; the v3 meta-schema states it stays editable until then. The edit cannot change the outcome for any existing contract or document: meta-schemas v0 to v3 never admitted a countPresent key, so registration refused it and no stored contract can carry it. Every existing rule parses, counts nodes and evaluates exactly as before.

How Has This Been Tested?

  • cargo test -p dpp --all-features --lib -- property_constraints: 104 passed, including the new should_parse_count_present, should_refuse_a_malformed_count_present, should_count_the_properties_a_document_holds, should_bound_how_many_of_a_group_a_document_sets and the generation 3 test should_count_the_presence_of_properties_the_type_declares (declared, nested and object paths accepted; unknown, $ownerId, $createdAt and transient paths refused on both parse paths; a repeated path refused by the meta-schema and the parser).
  • cargo test -p drive-abci --lib -- property_constraints: 40 passed, including the end-to-end should_hold_a_document_to_exactly_one_of_a_group_of_properties (the create and replace cases in the table above, through process_raw_state_transitions).
  • cargo clippy -p dpp --all-features --tests: clean.
  • wasm-dpp2, Swift and Kotlin were not built: their changes are a TypeScript type string and doc comments.

Breaking Changes

Consensus: from protocol version 14, a contract may declare countPresent in propertyConstraints, deleteConstraints, an immutable entry's when and retractedWhen, and documents are judged against it. Nothing changes before protocol version 14, and no existing contract or rule behaves differently.

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have added "!" to the title and described breaking changes in the corresponding section if my code contains any
  • I have made corresponding changes to the documentation if needed
  • If I added or changed GroveDB structure, I described it in the area's structure.rs, regenerated grovedb-structure.json, and checked the structure viewer link posted on this pull request

For repository code-owners and collaborators only

  • I have assigned this pull request to a milestone

🤖 Generated with Claude Code

PR Hygiene · bcf982e

  • Bots — coderabbitai ✓ · thepastaclaw ✓
  • Self-review — post /self-reviewed
  • Build running
  • Approvals
    • files with no dedicated owner — you own it
    • js-wasm-sdk (packages/js-evo-sdk/README.md) — shumkov
    • kotlin-sdk (packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/queries/DocumentPropertyConstraints.kt) — HashEngineering
    • dpp — you own it
    • rs-drive-abci — you own it
    • swift-sdk (packages/swift-sdk/Sources/SwiftDashSDK/Core/Utils/DocumentPropertyConstraints.swift) — llbartekll or romchornyi

When every merge requirement is met, the PR Hygiene check passes. Reviewer limits do not block merging; other required GitHub checks and protections still apply.

Summary by CodeRabbit

  • New Features

    • Added countPresent property constraints, which count how many of two or more distinct properties are present. Rules can compare the count against exact values, minimums, maximums, or ranges.
    • Counts use the same presence checks as existing property constraints.
  • Documentation

    • Updated schema, SDK, and platform documentation to describe countPresent, supported property paths, and its contribution to constraint limits.

…countPresent, PV14)

A propertyConstraints rule could say a property is present or absent, but
bounding how many of a group are set ("exactly one of email, phone,
handle", "at most two of these five") meant an anyOf plus a not of every
pair, which outgrows the 32-node rule limit at five properties.

countPresent is a new integer expression: how many of two or more
distinct property paths the document holds, each as `present` tests it.
Compared with a number or listed in an `in`, it gives every bound:

  { "equal": [{ "countPresent": ["email", "phone", "handle"] }, 1] }
  { "in": [{ "countPresent": ["email", "phone", "handle"] }, [1, 2]] }

It costs one node plus one per path, never faults, and its paths are
checked like a presence test's (any declared property, none transient, no
system value). A repeated path is refused by the meta-schema and on every
parse. Added in place to meta-schema v3 and parser generation 3, which
only protocol version 14 selects; earlier meta-schemas never admitted the
key, so no stored contract can hold it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added this to the v5.0.0 milestone Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

📖 Book Preview built successfully.

Download the preview from the workflow artifacts.
To view locally: download the artifact, unzip, and open index.html.

Updated at 2026-10-08T13:24:47.604Z

@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Waiting for bot review — coderabbitai not yet · thepastaclaw not yet. Wait for the missing reviews, or a writer can post /skip-bots to proceed without them; blocking findings still need addressing.
Full checklist in the description.

@github-actions github-actions Bot added the waiting-bots Waiting for the review bots to report on this head label Oct 8, 2026
@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: dashpay/platform/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 1186e9ed-986b-4c08-b028-5e04bb628cd5
📥 Commits

Reviewing files that changed from the base of the PR and between dedd2fd and bcf982e.

📒 Files selected for processing (2)
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v3/immutable_tests.rs
  • packages/rs-dpp/src/data_contract/document_type/property_constraints/mod.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/rs-dpp/src/data_contract/document_type/property_constraints/mod.rs

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The change adds countPresent, an integer property-constraint expression that counts present paths from a list of at least two distinct properties. The Rust parser and evaluator, v3 schema, tests, documentation, and SDK descriptions now include the expression.

Changes

countPresent Property Constraint

Layer / File(s) Summary
Schema, parsing, and evaluation
packages/rs-dpp/schema/meta_schemas/document/v3/document-meta.json, packages/rs-dpp/src/data_contract/document_type/property_constraints/mod.rs, packages/wasm-dpp2/src/data_contract/document_type_property_constraints.rs
The v3 schema and expression types include countPresent with at least two distinct paths. The Rust parser rejects malformed or duplicate paths. Evaluation counts present paths and records them as presence reads.
Parser and state-transition validation
packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v3/*, packages/rs-dpp/src/data_contract/document_type/property_constraints/tests.rs, packages/rs-drive-abci/.../tests/document/property_constraints.rs
Tests cover parsing and evaluation, including null, missing, zero, and false values. Contract tests cover invalid paths and stored and written document reads. State-transition tests cover create and replace outcomes for a one-contact constraint.
Documentation and SDK descriptions
book/src/..., packages/rs-platform-version/src/version/*, packages/js-evo-sdk/README.md, packages/kotlin-sdk/.../DocumentPropertyConstraints.kt, packages/swift-sdk/.../DocumentPropertyConstraints.swift
Documentation and SDK descriptions cover the expression, its presence-read classification, path requirements, and node cost.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Feature

Suggested reviewers: thepastaclaw

Merge Risk: ⚪ Minimal · up to bcf98

This change adds a countPresent expression for property constraints, selected only by protocol version 14. No merge-blocking risk was identified in the supplied material.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main change: adding the countPresent expression for counting properties, with the relevant protocol version.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 25 functions across 10 files.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@thepastaclaw

thepastaclaw commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

✅ Final review complete — no blockers (commit bcf982e) · triage: normal

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Waiting for bot review — coderabbitai ✓ · thepastaclaw not yet. Wait for the missing reviews, or a writer can post /skip-bots to proceed without them; blocking findings still need addressing.
Full checklist in the description.

@thepastaclaw thepastaclaw left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Final validation — Phase 1 + Phase 2

Verified the supplied findings against head dedd2fd. No blocking defects were confirmed; the remaining feedback is a targeted test-coverage suggestion and a stale Rust API comment. This was a static review: the supplied CI snapshot reports successful Rust workspace, WASM, Swift, and Kotlin checks, with one browser-test shard and PR Hygiene still pending.

🟡 1 suggestion(s) | 💬 1 nitpick(s)

1 finding(s) not shown inline (the lines are not part of this PR's diff)

💬 Nitpick: PropertyRead::Presence documentation omits countPresent
packages/rs-dpp/src/data_contract/document_type/property_constraints/mod.rs:893-894

CountPresent now reports every listed path as PropertyRead::Presence in collect_property_reads, but this variant's documentation still names only present and absent. Include countPresent so the Rust API documentation accurately describes which expressions produce presence reads, matching the updated WASM, Swift, and Kotlin comments.

    /// Only whether the document holds it, in a `present`, `absent` or
    /// `countPresent`: a property of any type, an object included.

source: muse-spark-1.3-contributor (phase1-reviewer: general, rust-quality)

Review provenance

Source: reviewer 1: muse-spark-1.3-contributor (agent: phase1-reviewer, role: general); reviewer 2: muse-spark-1.3-contributor (agent: phase1-reviewer, role: rust-quality); reviewer 3: gpt-6.1-sol (agent: phase2-reviewer, role: general); reviewer 4: gpt-6.1-sol (agent: phase2-reviewer, role: architecture-layering); reviewer 5: gpt-6.1-sol (agent: phase2-reviewer, role: ffi-engineer); reviewer 6: gpt-6.1-sol (agent: phase2-reviewer, role: platform-versioning); reviewer 7: gpt-6.1-sol (agent: phase2-reviewer, role: rust-quality); reviewer 8: gpt-6.1-sol (agent: phase2-reviewer, role: security-auditor); final verifier: gpt-6.1-sol (agent: sol-verifier, role: final-verifier)

  • Triage: normal by gpt-6.1-sol (effort low) — The consensus-relevant change in property_constraints/mod.rs adds a straightforward, bounded expression with parsing, evaluation and node accounting, but is not large or intricate enough to qualify as critical.
  • Phase 1 reviewers: muse-spark-1.3-contributor — general (completed, effort xhigh); agent phase1-reviewer, muse-spark-1.3-contributor — rust-quality (completed, effort xhigh); agent phase1-reviewer
  • Phase 1 model: muse-spark-1.3-contributor — not quota-gated; passed over gemini-3.8-flash-high (antigravity below 15% reserve: weekly 15% left, 5h 100% left), glm-5.3-flash (not used above high effort; tier asks max)
  • Fresh verifier: gpt-6.1-sol — final-verifier; agent sol-verifier
  • Phase 2 reviewers: gpt-6.1-sol — general (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — architecture-layering (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — ffi-engineer (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — platform-versioning (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — rust-quality (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — security-auditor (completed, effort high); agent phase2-reviewer
🤖 Prompt for all review comments with AI agents
These findings are from an automated code review. Verify each finding against the current code and only fix it if needed.

In `packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v3/property_constraints_tests.rs`:
- [SUGGESTION] packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v3/property_constraints_tests.rs:974-979: Add countPresent coverage for stored-document conditions
  The new tests cover ordinary propertyConstraints parsing and create/replace evaluation, but none exercise countPresent in deleteConstraints, immutable when, or retractedWhen, including the advertised $old paths. These contexts share the expression parser, but differ in stored-read admission and which document supplies the values. Add a focused immutable or retractedWhen test counting $old paths with different stored and replacement values, and assert that the same paths are rejected in propertyConstraints. This would lock down the new expression's interaction with the existing stored-document boundary; no current implementation failure was found.

In `packages/rs-dpp/src/data_contract/document_type/property_constraints/mod.rs`:
- [NITPICK] packages/rs-dpp/src/data_contract/document_type/property_constraints/mod.rs:893-894: PropertyRead::Presence documentation omits countPresent
  CountPresent now reports every listed path as PropertyRead::Presence in collect_property_reads, but this variant's documentation still names only present and absent. Include countPresent so the Rust API documentation accurately describes which expressions produce presence reads, matching the updated WASM, Swift, and Kotlin comments.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Bots are done — your move: post /self-reviewed.
Full checklist in the description.

@github-actions github-actions Bot added waiting-self-review Waiting for the author to post /self-reviewed and removed waiting-bots Waiting for the review bots to report on this head labels Oct 8, 2026
A condition judging a replace counts the stored document's properties
through `$old.` and the written one's without it; the same paths in a
propertyConstraints rule are refused. Also names countPresent among the
expressions producing a presence read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Waiting for bot review — coderabbitai ✓ · thepastaclaw not yet. Wait for the missing reviews, or a writer can post /skip-bots to proceed without them; blocking findings still need addressing.
Full checklist in the description.

@github-actions github-actions Bot added waiting-bots Waiting for the review bots to report on this head and removed waiting-self-review Waiting for the author to post /self-reviewed labels Oct 8, 2026

@thepastaclaw thepastaclaw left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-review — Final validation — Phase 1 + Phase 2

Static verification of the complete PR diff at bcf982e found no actionable in-scope defects: countPresent reuses existing presence semantics, validates every counted path, includes paths in node accounting, and remains isolated behind the PV14 grammar and validation gates. Both prior findings are fixed. No builds or tests were run locally; the supplied CI snapshot still showed Rust workspace tests, JS builds, Kotlin checks, and Docker builds in progress.

🔴 0 blocking | 🟡 0 suggestion(s) | 💬 0 nitpick(s)

Review provenance

Source: reviewer 1: muse-spark-1.3-contributor (agent: phase1-reviewer, role: general); reviewer 2: muse-spark-1.3-contributor (agent: phase1-reviewer, role: rust-quality); reviewer 3: gpt-6.1-sol (agent: phase2-reviewer, role: general); reviewer 4: gpt-6.1-sol (agent: phase2-reviewer, role: architecture-layering); reviewer 5: gpt-6.1-sol (agent: phase2-reviewer, role: ffi-engineer); reviewer 6: gpt-6.1-sol (agent: phase2-reviewer, role: platform-versioning); reviewer 7: gpt-6.1-sol (agent: phase2-reviewer, role: rust-quality); reviewer 8: gpt-6.1-sol (agent: phase2-reviewer, role: security-auditor); reviewer 9: gpt-6.1-sol (agent: phase2-reviewer, role: general); reviewer 10: gpt-6.1-sol (agent: phase2-reviewer, role: architecture-layering); reviewer 11: gpt-6.1-sol (agent: phase2-reviewer, role: ffi-engineer); reviewer 12: gpt-6.1-sol (agent: phase2-reviewer, role: platform-versioning); reviewer 13: gpt-6.1-sol (agent: phase2-reviewer, role: rust-quality); reviewer 14: gpt-6.1-sol (agent: phase2-reviewer, role: security-auditor); final verifier: gpt-6.1-sol (agent: sol-verifier, role: final-verifier)

  • Triage: normal by gpt-6.1-sol (effort low) — The diff changes consensus-relevant parsing and evaluation in property_constraints/mod.rs, but adds a contained, straightforward counting expression rather than large or intricate critical-surface logic.
  • Phase 1 reviewers: muse-spark-1.3-contributor — general (completed, effort xhigh); agent phase1-reviewer, muse-spark-1.3-contributor — rust-quality (completed, effort xhigh); agent phase1-reviewer
  • Phase 1 model: muse-spark-1.3-contributor — not quota-gated; passed over gemini-3.8-flash-high (antigravity below 15% reserve: weekly 15% left, 5h 100% left), glm-5.3-flash (not used above high effort; tier asks max)
  • Fresh final gate: an independent Phase-2 review ran after iterative findings were reconciled
  • Fresh verifier: gpt-6.1-sol — final-verifier; agent sol-verifier
  • Phase 2 reviewers: gpt-6.1-sol — general (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — architecture-layering (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — ffi-engineer (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — platform-versioning (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — rust-quality (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — security-auditor (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — general (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — architecture-layering (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — ffi-engineer (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — platform-versioning (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — rust-quality (completed, effort high); agent phase2-reviewer, gpt-6.1-sol — security-auditor (completed, effort high); agent phase2-reviewer
🤖 Prompt for all review comments with AI agents
These findings are from an automated code review. Verify the current code and confirm that no unresolved issues remain.

No unresolved findings remain from the prior review on this head.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Bots are done — your move: post /self-reviewed.
Full checklist in the description.

@github-actions github-actions Bot added waiting-self-review Waiting for the author to post /self-reviewed and removed waiting-bots Waiting for the review bots to report on this head labels Oct 8, 2026
@QuantumExplorer
QuantumExplorer merged commit c432a31 into v5.0-dev Oct 8, 2026
50 of 51 checks passed
@QuantumExplorer
QuantumExplorer deleted the claude/document-property-cardinality-98ff28 branch October 8, 2026 15:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

waiting-self-review Waiting for the author to post /self-reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants