Skip to content

feat(platform)!: skipIfAbsent may skip on a derived index property (PV14) - #5318

Merged
QuantumExplorer merged 2 commits into
v5.0-devfrom
claude/derived-index-properties-e2d26c
Oct 7, 2026
Merged

QuantumExplorer merged 2 commits into
v5.0-devfrom
claude/derived-index-properties-e2d26c

Conversation

@QuantumExplorer

@QuantumExplorer QuantumExplorer commented Oct 7, 2026 •

Copy link
Copy Markdown
Member

Basic explanation

What this does: A document type can index a value it does not store, read from the document one of its references points at. For example, a reply indexed by quoteId.$ownerId is filed under the owner of the post it quotes. Until now, a reply quoting no post was still written into that index under an empty (null) value. With this change, the index can instead leave such a reply out entirely, the same way skipIfAbsent already leaves out documents missing one of their own properties.

Value: Apps get indexes that hold only the documents that actually have the value. "Replies quoting my posts" or "replies to posts tagged X" then never store or walk entries for replies that quote nothing or whose post has no tag. Counts and rankings over such an index count only the documents that have the value.

Risks: Low to medium. This is consensus code at protocol version 14, which is not released yet, so no live data or earlier protocol version is affected. The new rule in Drive is that a null skip value counts as absent. It applies to every skip property, but a stored document never holds null for one of its own properties, so in practice it only changes behaviour for derived values. A wrong skip decision would leave an index entry behind or look for one that is not there, failing the delete or replace. The new end-to-end test covers create, edit, delete, moderator removal of the referenced post, and moderator removal and restore of the reply, and it fails when the null rule is reverted.

Issue being fixed or feature implemented

Derived index properties (#5216, #5223) were refused as skipIfAbsent properties. A document whose reference was absent, or whose referenced document had no value for the field, could only be filed under null.

What was done?

Before: registration refused the index.

{
  "name": "byQuotedOwner",
  "properties": [{ "quoteId.$ownerId": "asc" }, { "$createdAt": "asc" }],
  "skipIfAbsent": ["quoteId.$ownerId"]
}
index "byQuotedOwner" on document type "reply" skips on nested property "quoteId.$ownerId":
a skip property must be a top-level property, so that presence is a single lookup with no
partially-present ancestor states

(Past that check, the derived-property rules refused it too.)

After: the index registers. A reply quoting no post writes nothing into byQuotedOwner, and its delete looks for nothing there. A reply quoting a post is filed under that post's owner, as before.

Parser (dpp)

  • The skipIfAbsent array may name a derived index property. skip_if_absent_index_error now admits a dotted name that reads through a reference (new helper reads_through_reference, which also replaces an equivalent parse_derived_index_property_name(..) != NotDerived check in index property validation).
  • skipIfAbsent: true still means the type's own optional properties and leaves derived properties out. Whether a derived value can be absent depends on the referenced type, which the per-type parse that resolves true cannot see. An index whose only optional properties are derived is refused under true, and the message points to the array form.
  • resolve_derived_index_properties (full validation, every build) refuses a derived skip property that:
    • is never absent: the reference property is required and the field always holds a value ($ownerId, $creatorId, or a schema property required together with every object around it);
    • is a byte array with minItems 0 on the referenced type, since an empty byte array is keyed like a missing value (the same rule a stored type's own skip properties follow).
  • The referring-side refusal of a derived skip property is removed.

Drive

  • document_carries (index_level_tree_types.rs) decides whether a document carries a skip property: present and not null. Drive already puts a derived value into the document before keying it, as null when the reference or the field is absent, so that null now skips. The v2 insert and delete walkers and update v1 all go through it.
  • The SDK document cost walker (cost/writes.rs) uses the same rule. A derived value the caller did not supply counts as carried while its reference is present, which keeps the estimate an upper bound, and as absent when the reference is absent.

Docs

  • Book: a new "Skipping a document without the value" section in derived-index-properties.md, and the skipIfAbsent rules in indexes.md updated.
  • Meta-schema v3 skipIfAbsent description and v14 note 65.

In-place changes to shipped generations

  • create_document_types_from_document_schemas 1 (selected at PV9 to PV14): the new checks sit in resolve_derived_index_properties, which acts only on derived index properties. Only parser generation 3 (PV14) declares them, so the function's output is unchanged at every shipped version.
  • Shared index parse in try_from_schema/common (used by the shipped generations): the skipIfAbsent: true resolution runs only when index.skip_if_absent is set, which only generation 3's grammar admits. The reads_through_reference check is behind admit_derived_index_properties, also generation 3 only, and is equivalent to the check it replaces.
  • Drive add/remove index walkers v2 and update_document_for_contract_operations 1: selected only at PV14 (unreleased). In addition, every index of an earlier contract has an empty skip set, so takes_part_in_index_by returns true without reading the document.

How Has This Been Tested?

  • dpp: five new tests in derived_index_property_tests.rs, covering the array form admitted on every parse, $ownerId through an optional vs a required reference, never-absent fields (a nested required field inside an optional object is admitted, and refused once the object is required), empty byte arrays, and true leaving derived properties out. The old skip refusal test is narrowed to the unique-index case. cargo test -p dpp --features all_features --lib data_contract: 2798 passed.
  • drive-abci: new end-to-end test should_skip_a_reply_whose_derived_value_is_absent. It checks the GroveDB index levels directly: byTopic and byQuotedOwner hold no null value, while the non-skipping byTag does. It also checks queries and proofs, edits, deletion of a skipped reply after its post was removed (value read from the removal record), and moderator removal and restore of a reply. Mutation check: with the old contains_key rule, byTopic gains a null key and the test fails. cargo test -p drive-abci --lib -- derived_index skip index_only document_cost: 49 passed.
  • drive: cargo test -p drive --lib -- skip cost derived layout index_only: 271 passed.
  • cargo clippy -p dpp -p drive -p drive-abci --all-targets -- -D warnings: clean. cargo fmt --all: clean.

Breaking Changes

Consensus change at protocol version 14 (unreleased): contracts that registration used to refuse are now accepted, and Drive skips documents holding a null skip value. No effect on any earlier protocol version.

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

Summary by CodeRabbit

  • New Features

    • Indexes can now skip documents when a derived property from a referenced document is missing or null, when that property is explicitly listed in skipIfAbsent.
    • Queries using startAt or startAfter must fix derived properties with ==.
  • Bug Fixes

    • Indexing and document updates now handle absent derived values consistently, including when referenced documents are removed or restored.
  • Documentation

    • Clarified eligibility rules for derived skip properties, including requirements for optional values and byte-array fields.

PR Hygiene · fb440ba

  • Bots — coderabbitai skipped after its own rate limit · thepastaclaw ✓
  • Self-review — post /self-reviewed
  • Build green
  • Approvals — you own every area touched; none needed

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.

…V14)

An index property read through a reference ("quoteId.$ownerId") can now
be a skip property, so an index leaves out a document whose reference
or referenced field is absent instead of filing it under null.

- Only the skipIfAbsent array names one; `true` keeps meaning the
  type's own optional properties, since whether a derived value can be
  absent depends on the referenced type.
- Registration refuses a derived skip property that is never absent (a
  required reference reading $ownerId, $creatorId or a field required
  with every object around it) and a byte array that may be empty.
- Drive's walkers, update and the SDK cost walker count a null skip
  value as absent, which a derived value is when its reference or
  field is.

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

coderabbitai Bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 16 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository: dashpay/platform/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 4f3e443c-c3a6-4f0b-9c17-108030accb69
📥 Commits

Reviewing files that changed from the base of the PR and between 4edc967 and fb440ba.

📒 Files selected for processing (1)
  • packages/rs-drive/src/drive/document/cost/tests.rs

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: f85bb62b-a4e1-4ef8-87a4-d87e58f422b8
📥 Commits

Reviewing files that changed from the base of the PR and between 2643dc1 and 4edc967.

📒 Files selected for processing (12)
  • book/src/contract-keywords/derived-index-properties.md
  • book/src/contract-keywords/indexes.md
  • packages/rs-dpp/schema/meta_schemas/document/v3/document-meta.json
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/common/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v3/derived_index_property_tests.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v3/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/index/derived_index_property.rs
  • packages/rs-dpp/src/data_contract/document_type/index/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/tests/derived_index_properties.rs
  • packages/rs-drive/src/drive/document/cost/writes.rs
  • packages/rs-drive/src/drive/document/index_level_tree_types.rs
  • packages/rs-platform-version/src/version/v14.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

This change allows derived index properties in array-form skipIfAbsent when validation confirms their values can be absent. It updates parsing and reference validation, treats null derived values as absent during index participation, and adds coverage for index contents across edits and moderation.

Changes

Derived Index Skip Behavior

Layer / File(s) Summary
Derived skip-property validation
packages/rs-dpp/src/data_contract/document_type/..., packages/rs-dpp/schema/meta_schemas/document/v3/document-meta.json
Parsing and reference resolution allow derived properties in skipIfAbsent arrays when the referenced value can be absent. Validation rejects always-present values and byte arrays without minItems of at least 1. Boolean true still selects only optional properties on the index document.
Index presence checks
packages/rs-drive/src/drive/document/..., packages/rs-drive-abci/src/execution/validation/.../tests/derived_index_properties.rs
Skip-property checks account for a derived value through its reference property. Null values count as absent. Tests cover omitted and null index entries across edits, removals, restoration, and committed-state proofs.
Skip-property contract and documentation
book/src/contract-keywords/*, packages/rs-platform-version/src/version/v14.rs
Documentation describes array-form derived skip properties, absence requirements, and cursor-query constraints. The document meta-schema description is updated without changing schema keywords.

Priority: ➖ Normal

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

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant DocumentWrite
  participant Context
  participant Carries
  participant DocumentCarries
  participant IndexLevel
  DocumentWrite->>Context: evaluate index participation and reachability
  Context->>Carries: check skip-property presence
  Carries->>DocumentCarries: check document value and reference property
  Context->>IndexLevel: determine index participation and reachability
Loading

Suggested reviewers: pastapastapasta

Merge Risk: ⚪ Minimal · up to 4edc9

This change lets contracts skip indexing a document when a value read through a reference is absent. No blocking issue was identified, and the reported tests cover the new behavior.

🚥 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: allowing skipIfAbsent on derived index properties in PV14.
Docstring Coverage ✅ Passed Docstring coverage is 88.24% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 34 functions across 9 files. (3 skipped: 3 …
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 7, 2026 •

Copy link
Copy Markdown
Collaborator

✅ Final review complete — no blockers (commit fb440ba) · triage: critical

@github-actions

github-actions Bot commented Oct 7, 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-07T09:03:33.254Z

@github-actions

github-actions Bot commented Oct 7, 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 the waiting-bots Waiting for the review bots to report on this head label Oct 7, 2026
@github-actions github-actions Bot added this to the v5.0.0 milestone Oct 7, 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.

Final validation — Phase 1 + Phase 2

Verified the supplied findings against head 4edc967. The two Claude findings identify the same valid, non-blocking coverage gap in the client cost estimator and are combined below; no blocking issue was confirmed. Validation was static only: diff whitespace checks passed, no builds or tests were run, and the supplied CI snapshot had no completed validation results.

🟡 1 suggestion(s)

Review provenance

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

  • Triage: critical by gpt-6.1-sol (effort low) — The diff intricately changes consensus-visible contract validation and index participation across reference-derived values, notably resolve_derived_index_properties in rs-dpp and document_carries in rs-drive, affecting create, update, delete, and moderation behavior.
  • 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)
  • Single stage: Phase 1 and Phase 2 reviewed this head side by side, with no blocker gate between them (triage tier)
  • Fresh verifier: gpt-6.1-sol — final-verifier; agent sol-verifier
  • Phase 2 reviewers: gpt-6.1-sol — general (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — architecture-layering (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — platform-versioning (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — rust-quality (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — security-auditor (completed, effort xhigh); 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-drive/src/drive/document/cost/writes.rs`:
- [SUGGESTION] packages/rs-drive/src/drive/document/cost/writes.rs:201-207: Cover derived skip-value fallback in client cost estimates
  The new fallback distinguishes an unresolved derived value from an explicitly supplied null: a missing derived entry participates when its reference is present, while an explicit Value::Null skips even with that reference present. The added drive-abci lifecycle test exercises server-side resolution but never calls document_create_cost, and the existing cost tests cover ordinary skip properties rather than this derived-value fallback. Add a table-driven regression through document_create_cost covering an omitted derived value with its reference present and absent, an explicit null with the reference present, and a supplied non-null value. Assert that skipped indexes receive neither own nor shared storage allocation, that a participating sibling retains its allocation, and that the unresolved, reference-present case still prices the derived index. This protects both conservative estimation and correct shared-layer attribution.

The SDK cost walker counts a derived value the caller did not resolve as
present while its reference is, and a null one as absent. A table of four
replies (unresolved with and without a quote, resolved to null, resolved)
checks that a skipped index takes neither its own layer nor a share of
the sibling's, that the sibling keeps its entry, and that an unresolved
owner is priced as a resolved one.

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

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Waiting for bot review — coderabbitai not yet · thepastaclaw ✓. 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.

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

Independently reviewed the complete diff at fb440ba and found no actionable in-scope defects. The derived skip behavior remains gated to PV14, and the new client-cost regression addresses the prior coverage finding. This was static verification only; the supplied exact-head CI snapshot still shows checks pending or queued, so build and test success is not established.

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

Review provenance

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

  • Triage: critical by gpt-6.1-sol (effort low) — The diff intricately changes consensus-visible contract validation and index membership across parsing, cost estimation, and document lifecycle operations, notably in resolve_derived_index_properties and document_carries in packages/rs-drive/src/drive/document/index_level_tree_types.rs.
  • 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)
  • Single stage: Phase 1 and Phase 2 reviewed this head side by side, with no blocker gate between them (triage tier)
  • 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 xhigh); agent phase2-reviewer, gpt-6.1-sol — architecture-layering (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — platform-versioning (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — rust-quality (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — security-auditor (completed, effort xhigh); agent phase2-reviewer, gpt-6-astra — general (completed, effort xhigh); agent phase2-reviewer, gpt-6-astra — architecture-layering (completed, effort xhigh); agent phase2-reviewer, gpt-6-astra — platform-versioning (completed, effort xhigh); agent phase2-reviewer, gpt-6-astra — rust-quality (completed, effort xhigh); agent phase2-reviewer, gpt-6-astra — security-auditor (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — general (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — architecture-layering (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — platform-versioning (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — rust-quality (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — security-auditor (completed, effort xhigh); agent phase2-reviewer
  • Model comparison: every Phase-2 reviewer also ran on gpt-6-astra; the verifier weighed both sets without knowing which model wrote which
🤖 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 7, 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 bot-review-skipped A required review bot did not report; it was skipped by the window or by a person. and removed waiting-bots Waiting for the review bots to report on this head labels Oct 7, 2026
@QuantumExplorer
QuantumExplorer merged commit 1742775 into v5.0-dev Oct 7, 2026
43 of 47 checks passed
@QuantumExplorer
QuantumExplorer deleted the claude/derived-index-properties-e2d26c branch October 7, 2026 14:39
@QuantumExplorer QuantumExplorer mentioned this pull request Oct 13, 2026
8 of 26 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bot-review-skipped A required review bot did not report; it was skipped by the window or by a person. 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