Skip to content

[P3] markers-checklist: follow-up - TJ review#2254

Closed
rolfheij-sil wants to merge 5 commits into
ai/mainfrom
ai/feature/markers-checklist-followup-rolf-05-11-2026
Closed

[P3] markers-checklist: follow-up - TJ review#2254
rolfheij-sil wants to merge 5 commits into
ai/mainfrom
ai/feature/markers-checklist-followup-rolf-05-11-2026

Conversation

@rolfheij-sil
Copy link
Copy Markdown
Contributor

@rolfheij-sil rolfheij-sil commented May 11, 2026

Code Review Summary

Branch: ai/feature/markers-checklist-followup-rolf-05-11-2026

Base: origin/ai/main

Date: 2026-05-12

Review model: Claude Opus 4.7

Files changed: 12 (pre-review) → 16 (after in-review changes; +2 staged source edits + 1 new test + dist regen)

Overview

Follow-up PR to the merged markers-checklist work (PR #2219) addressing TJ Couch's code-review comments. The branch swaps two duplicated extension-local types (ChecklistScriptureVerseRef, ChecklistScriptureRange) for the platform's canonical SerializedVerseRef / ScriptureRange, drops the redundant name field from ChecklistComparativeTextRef (PT10 is greenfield — GUIDs are canonical), expands TSDocs across the checklist contract surface, and adds an @experimental marker to LinkedScrRefButton with an explicit migration target (LinkedScrRefDisplay from PR #1949). All test suites updated coherently with the contract changes; no orphaned name-fallback assertions remain.

During the review, three items were fixed in-place: a Prettier-mangled JSDoc block on PopoverPortalContainerProvider (pre-existing from PR #2219, surfaced by the dist regen here), a docs-vs-code mismatch on ChecklistRequest.verseRange.end semantics (now honors the platform ScriptureRange contract), and minor TSDoc / @experimental / test-name hygiene. The C# ResolveVerseRange change is the only behavior change introduced by this review — covered by a new regression test and no production caller exercises the changed path today.

API Changes

  • extensions/src/platform-scripture/src/types/platform-scripture.d.ts:
    • Removed ChecklistScriptureVerseRef export (consumers should use SerializedVerseRef).
    • Removed ChecklistScriptureRange export (consumers should use ScriptureRange).
    • ChecklistComparativeTextRef — removed name: string property (now { id: string } only).
    • ChecklistRequest.verseRange — type changed from ChecklistScriptureRange | undefined to ScriptureRange | undefined. Field-by-field compatible at the wire level; with the in-review C# fix, end === undefined now narrows to a single-verse range at start per the platform contract.
    • TSDoc-only expansions on IVersificationService, ChecklistMarkerSettings, ChecklistRequest, ChecklistResultResponse, MarkerSettingsValidationResult, ResolvedComparativeTexts, IChecklistService, and the 'platformScripture.openMarkersChecklistSettings' command. Behavioral note on IVersificationService corrects an earlier wrong claim ("fixed at project open") to "reads fresh each call" — matches the existing C# implementation; no code change.
  • lib/platform-bible-react/:
    • LinkedScrRefButtonProps and the LinkedScrRefButton function — TSDoc @experimental markers added (function-level marker added during review for IDE visibility at every call site).
    • ScopeSelectorProps.rangeStart / rangeEnd / currentScrRef — TSDoc-only expansions.
    • PopoverPortalContainerProvider — TSDoc rephrased so <HTMLElement | null>(null) lands mid-line (fixed during review).
  • lib/platform-bible-react/dist/index.{d.ts,cjs,cjs.map,js,js.map} — regenerated to reflect source changes. Includes a benign CSS reordering churn for .banded-row rules (build-tool non-determinism, no semantic change).
  • C# ResolveVerseRange (c-sharp/Checklists/ChecklistService.cs) — behavior change: range.End == null now returns (start, start) (single-verse) instead of (start, lastVerseOfProject), matching the platform ScriptureRange contract. No production caller currently triggers the changed branch.

Findings

Critical — Must address before merge

None.

Important — Should address before merge

  • Removed public-type exports (ChecklistScriptureVerseRef, ChecklistScriptureRange, ChecklistComparativeTextRef.name) are technically breaking changes to an extension .d.ts. Suggested: keep @deprecated aliases for one release cycle. (Author dismissed: rip-the-bandaid is intentional. PR [P3][backend+ui] markers-checklist: Backend + UI implementation (C# data provider, React web view, E2E tests) #2219 just merged with no time for external consumers to depend on these types; wire compatibility is preserved (the C# DTO ignores the extra name field). The PR body documents this.)
  • IVersificationService.lookupFinalVerseNumbersInBook @example block was corrupted by Prettier reflow (Const capitalized; statements collapsed onto run-on lines). (Author dismissed: PR [P3] markers-checklist: follow-up T1-stage-2 - Versification NetworkObject → projectInterface on ParatextProjectDataProvider #2256 deletes IVersificationService entirely, replacing it with IVersificationProjectDataProvider on the ParatextProjectDataProvider. The mangled example lives in code that's being removed.)
  • Prettier-reflowed JSDoc on PopoverPortalContainerProvider — inline useState<HTMLElement | null>(null) was split across paragraphs because | started a new line. Pre-existing from PR [P3][backend+ui] markers-checklist: Backend + UI implementation (C# data provider, React web view, E2E tests) #2219 but surfaced by the dist regen here. (Fixed during review: rephrased the prose so the inline type stays mid-line; dist regenerated.)
  • ChecklistRequest.verseRange TSDoc vs C# mismatch — TSDoc claimed "When the range omits end, only the verse at start is included" but the C# treated End == null as "scan to last verse of last book". (Fixed during review — chose Option B over Option A: updated C# ResolveVerseRange to honor the platform ScriptureRange contract (End == null → single-verse at Start); updated TSDoc to reference the platform semantics; added regression test BuildChecklistData_VerseRangeEndOmitted_ScansSingleVerseAtStart. Rationale: TJ's whole T4/T5 request was "use the canonical type" — adopting the type without honoring its contract leaves a trap for future readers. No production caller currently triggers the changed branch, so behavior risk is zero.)

Minor — Consider

  • IVersificationService NOTE at platform-scripture.d.ts:816-818 references "the markers-checklist post-merge review" — internal review process leaking into public TSDoc. (Author dismissed: type is deleted in PR [P3] markers-checklist: follow-up T1-stage-2 - Versification NetworkObject → projectInterface on ParatextProjectDataProvider #2256; the NOTE goes with it.)
  • ResolvedComparativeTexts.texts[].name / fullName TSDoc — should document the "" fallback when available: false (C# returns string.Empty for unresolved entries). (Fixed during review: added "or '' when available is false" to both fields' TSDocs.)
  • UX-affordance trade-off: with requested.Name no longer available, the renderer can no longer display a user-typed name when a comparative text fails to resolve. (Author dismissed: intentional per PR body. PT10 is greenfield and every project has a canonical GUID, so PT9's name-fallback covers scenarios we don't have; no renderer code currently consumes the unresolved name.)
  • Test name ResolveComparativeTexts_MixedResolutionPaths_… no longer accurate — with name-fallback removed there is only one resolution path (GUID). (Fixed during review: renamed to ResolveComparativeTexts_MixedAvailability_PreservesOrderAndCorrectlyFlagsAvailability in both the method name and the xmldoc <see cref>.)
  • Comment numbering inconsistency in ResolveSingleComparativeRef — header uses (a)/(b)/(c) while the body uses Step 2(a)/(b)/(c). (Author dismissed: cosmetic. The body's Step 2 prefix is intentional — it continues the caller ResolveComparativeTexts's Step 1, Step 2 numbering. The header's bare (a)/(b)/(c) is a preamble, not a continuation. Both are correct in context.)
  • @experimental JSDoc only on LinkedScrRefButtonProps, not on the exported function — IDE / TypeDoc surfaces the marker only at the type-import site, not at every call site. (Fixed during review: added @experimental JSDoc block to the LinkedScrRefButton function itself, linking to LinkedScrRefButtonProps for the full migration detail; dist regenerated.)

Template Propagation

Shared Regions Modified

None.

Extension Config Changes

None — no extension config/build files (package.json, tsconfig.json, webpack.config.ts, .eslintrc*) under extensions/ were modified in this PR.

Positive Observations

  • TSDoc expansion across IChecklistService, ChecklistRequest, and ChecklistResultResponse is substantive and improves the public surface — the new prose explains intent (e.g. "stateless RPC — no internal cache") rather than just restating field names.
  • The behavioral note on IVersificationService correcting "fixed at project open" → "reads fresh each call" aligns the docs with the actual C# implementation (verified against c-sharp/Projects/VersificationService.cs:42-71).
  • The @experimental marker on LinkedScrRefButton is the right tool for "shipped but expected to be replaced" — better than silently removing later. The marker links to the superseding PR (PT-3662, PT-3744, partially PT-3661 #1949) and names the migration target (LinkedScrRefDisplay).
  • The C# ComparativeTextRef change is internally consistent: the record, network-object wiring, service, and unit tests all updated together; no dangling Name references remain. The file header retains a History: block explaining why the field was dropped — exactly the kind of "future archaeologist" context that prevents this from being re-added later.
  • The renderer-side handleComparativeTextsChange callback dropped its allProjects dependency cleanly when name lookup disappeared.
  • Test updates are coherent: removed the name-fallback group, added a focused "malformed GUID" case, kept the duplicate-short-name resolution test. Property attributes (ScenarioId, Invariant) were trimmed where the old scenario (TS-047) no longer applies — no stale traceability metadata left behind.
  • Swapping ChecklistScriptureRange / ChecklistScriptureVerseRef for the platform's canonical ScriptureRange (and SerializedVerseRef already in use) is a clean DRY win — removes duplicated types that had drifted from the platform contract.
  • No new user-visible strings introduced; existing localization wiring untouched.
  • All 194 Checklists C# tests pass after the contract change, including the new regression test. Full TypeScript suite (1648 tests) passes clean.

Interview Notes

In-Review Quality Check

  • C# Checklists test suite (dotnet test --filter "FullyQualifiedName~Checklists"): 194 passed, 2 unrelated skipped, 0 failed. New regression test BuildChecklistData_VerseRangeEndOmitted_ScansSingleVerseAtStart passes.
  • npx prettier --check on popover.tsx source: clean (no reflow on the rephrased prose).
  • dotnet csharpier . in c-sharp/: ran clean (172 files formatted; no diff on the edited file beyond the intentional edit).
  • npm run format: clean for all 11 in-review files; one unrelated mdx file diff (pre-existing JSX indentation churn in lib/platform-bible-react/src/stories/guidelines/design-principles.mdx) was reverted by the quality-check subagent to keep this PR focused.
  • npm test full TypeScript suite: 1648 passed, 1 skipped, 0 failed. Note: The 5 storybook FAILs mentioned in the PR body did not recur in this run — likely because the dist rebuild cleared the cache. Not a regression.
  • npm run typecheck and npm run lint: each returned 1 pre-existing error — src/main/services/app.service-host.ts(9,23) cannot find '../../../release/app/buildInfo.json'. This file is generated by the build pipeline and is absent in fresh worktrees; not touched by any in-review change. Running npm run build (or the buildInfo-generation step) before CI clears it. Not blocking the review.

Suggested Review Focus

Prioritized areas for the author-reviewer meeting:


Merge sequencing: This PR is part of a 3-PR follow-up to PR #2219:

Either #2254 or #2256 can merge first; the other will need a rebase since they touch overlapping files (platform-scripture.d.ts, checklist.web-view.tsx). After both merge, #2258 may also need a rebase before merging.

Summary

Follow-up PR for the merged markers-checklist work (PR #2219). Addresses TJ Couch's code-review comments (12 items) on the original branch.

The original commits in this PR address TJ's concerns directly; later UX-review work (Sebastian, 2026-05-05) was moved off this branch to its own PR for clarity.


TJ review — 12 comments

Addressed (9 items):

# TJ comment Change
T1 stage 1 "Are you sure versification is fixed at project open?" Fixed wrong docstring on IVersificationService. Investigation confirmed versification IS mutable at runtime: PT9 ProjectSettings.Versification setter is public + invalidates cache; PT10 ParatextProjectDataProvider.SetProjectSetting fires SendDataUpdateEvent. The service is safe under mutation (fresh read per call) but the docstring lied.
T4 "Why doesn't [ChecklistScriptureVerseRef] just use SerializedVerseRef?" Replaced with platform SerializedVerseRef.
T5 "Why doesn't [ChecklistScriptureRange] just use ScriptureRange?" Replaced with platform ScriptureRange. Wire-compatible (C# DTO already accepts VerseRef? End).
T6 "Why do we need a name here?" Dropped. PT10 is greenfield (every project has a canonical GUID), so PT9's name-fallback covers scenarios we don't have. ChecklistComparativeTextRef is now { id: string } only. C# ComparativeTextRef record is (string Id). ChecklistService.ResolveComparativeTexts does GUID-only resolution.
T7/T8 "Not enough comments" + "More refs to workflow documents in public APIs" Expanded TSDocs across IChecklistService, all Checklist* types, IVersificationService methods, and openMarkersChecklistSettings. Removed every data-contracts.md §X.X reference.
T9 "Index 0 is unused...? Why?" Explained the 1-based ergonomic-access rationale on lookupFinalVerseNumbersInBook.
T11 "I don't understand the difference between currentScrRef and rangeStart" Tightened TSDocs on rangeStart / rangeEnd / currentScrRef to explain the fallback chain (rangeStartcurrentScrRef → GEN 1:1).
T12 "If so, would be best to ... mark this component in some way like @experimental" Marked LinkedScrRefButton @experimental with an explicit "to-be-removed when PR #1949 lands" warning.

Deferred / pushed back (3 items):

  • T1 stage 2 (IVersificationServiceprojectInterface on a PDP): Implemented as a separate PR ([P3] markers-checklist: follow-up T1-stage-2 - Versification NetworkObject → projectInterface on ParatextProjectDataProvider #2256) — methods now live directly on ParatextProjectDataProvider under a new 'platformScripture.Versification' projectInterface.
  • T2 (IChecklistService NetworkObject → DataProvider): pushed back with evidence — the service is genuinely stateless RPC, no cached state to invalidate.
  • T3 (validateMarkerSettings as project-setting validator): coupled to a marker-settings-as-project-setting refactor; backlog.
  • T10 (getEndVerse callback as data prop): pushed back with cost/benefit — consumer is single-book-at-a-time.

Wire compatibility note

The T6 change alters the JSON shape of the requestedTexts argument to IChecklistService.resolveComparativeTexts (drops the name field). The only producer is the markers-checklist web view in this repo, which this PR updates in lockstep. No external consumer is affected.

Doc-drift note

.context/features/markers-checklist/data-contracts.md §2.4 still mentions the Name field. That doc lives in ai-prompts; per Rolf's direction we are not opening an ai-prompts PR in this round for that sweep, so it will drift slightly until swept later.


Test plan

  • npm run lint — 0 errors (1 pre-existing warning, unrelated)
  • npm run typecheck — clean
  • npm test — TS suites pass except the 5 pre-existing storybook failures unrelated to this PR
  • dotnet test in c-sharp-tests/ — 706 passed, 0 failed, 6 skipped
  • lib/platform-bible-react/dist/ rebuilt and staged
  • CI green
  • Tested by Rolf

🤖 Generated with Claude Code


This change is Reviewable

…mental marker

Addresses TJ Couch's review on the merged PR #2219 (markers-checklist).

Changes (PT10-dev-perspective feedback):
- T1 stage 1: Fix wrong "versification is fixed at project open" docstring on
  IVersificationService. Versification IS mutable at runtime — PT9's
  ProjectSettings setter is public, PT10's ParatextProjectDataProvider fires
  SendDataUpdateEvent on the setting change. The service is safe under mutation
  (reads fresh each call) but the docstring lied. Also flagged the service as
  a candidate for projectInterface conversion (stage 2 in a separate PR).
- T9: Better TSDoc on lookupFinalVerseNumbersInBook — explain WHY index 0 is
  filler (1-based ergonomic access, no off-by-one), include a worked example.
- T4: Replace ChecklistScriptureVerseRef with platform SerializedVerseRef
  (the docstring already admitted they were the same shape).
- T5: Replace ChecklistScriptureRange with platform ScriptureRange. Platform
  type's end is optional; the C# DTO already accepts a null End so this is
  wire-compatible and the TS sites all still populate end explicitly.
- T6: Expand TSDoc on ChecklistComparativeTextRef.name — document the real
  fallback scenarios (legacy PT9 mementos, malformed GUIDs, PTX-23529
  identical short names) instead of the bare "fallback resolution method".
- T7/T8: Expand TSDocs across IChecklistService, ChecklistRequest,
  ChecklistResultResponse, MarkerSettingsValidationResult,
  ResolvedComparativeTexts, and the openMarkersChecklistSettings command.
  Drop all "data-contracts.md §X" references — TSDocs should stand alone
  for downstream consumers per TJ's proposed workflow rule.
- T11: Tighten ScopeSelector TSDocs on rangeStart/rangeEnd/currentScrRef to
  explain they are NOT duplicates — currentScrRef is a fallback in the
  chain (rangeStart → currentScrRef → GEN 1:1), and also drives the
  dropdown trigger's secondary display text.
- T12: Mark LinkedScrRefButton @experimental — slated for removal once
  PR #1949 (LinkedScrRefDisplay) lands.

Not addressed in this PR (deferred / pushback):
- T1 stage 2 (projectInterface conversion): larger refactor, follow-up PR.
- T2 (NetworkObject → DataProvider for IChecklistService): pushed back —
  service is genuinely stateless RPC, no cached state to invalidate.
- T3 (validateMarkerSettings as project-setting validator): coupled to
  marker-settings-as-project-setting refactor, backlog.
- T10 (getEndVerse callback as data prop): pushed back — the consumer
  only needs current-book data; a data prop would require pre-fetching
  all ~66 books and re-fetching on book change.

Verified:
- npm run lint — 0 errors (same pre-existing warnings as ai/main).
- npm run typecheck — clean across all workspaces.
- npm test — all 523 platform-bible-react tests pass; 5 storybook FAIL
  files are pre-existing on ai/main (stale storybook cache export issue).
TJ Couch (PR #2219 review, T6):
> Why do we need a name here? Shouldn't project IDs be plenty?

PT10 is greenfield: every project carries a canonical GUID, so PT9's
name-fallback (which existed for mementos that pre-dated GUID assignment)
covers scenarios we don't actually have. The duplicate-short-name case
(PTX-23529) is unaffected — GUID is what disambiguates there, and that's
what we keep.

Changes:
- TS `ChecklistComparativeTextRef` is now `{ id: string }` only. TSDoc
  rewritten to drop the fallback rationale.
- TS web view `handleComparativeTextsChange` no longer looks up project
  short-names just to populate `name`.
- C# `ComparativeTextRef` record is now `(string Id)` — single positional
  field. File header notes that the Name field was dropped per TJ's
  review and points at this PR.
- C# `ChecklistService.ResolveComparativeTexts`:
  - Drop step 2(b) name-fallback block (the
    `ScrTextCollection.Find(requested.Name)` call).
  - Step 2(d) sets `Name: found?.Name ?? string.Empty` (no requested.Name
    to fall back on).
  - Provenance comment + XML docs updated to remove "GUID-first /
    name-fallback" framing — now "GUID-only".
- C# tests:
  - Outer acceptance (Mixed paths): drop the BRAVO entry; the test now
    confirms ALPHA-resolves / ACTIVE-excluded / CHARLIE-unavailable.
  - Delete the dedicated TS-047 name-fallback test
    (`InvalidGuidValidName_FallsBackToFindByName`).
  - Delete the name-fallback variant of self-exclusion
    (`ComparativeRefIsActiveProjectByName_Excluded`).
  - Rename `InvalidGuidInvalidName_MarkedUnavailable` →
    `UnresolvableGuid_MarkedUnavailable`; add a sibling test for the
    malformed-GUID case (HexId.FromStrSafe → null → unavailable).
  - Tighten TS-048 (duplicate short name): name now omitted from the
    request, confirming GUID is the disambiguator.
  - `ChecklistDataModelTests.ComparativeTextRef_RoundTripsThroughJson`
    and `ComparativeTextRef_WithExpressionProducesNewInstance` updated to
    the new single-field shape.

Verified:
- npm run typecheck — clean across all workspaces.
- npm run lint — 0 errors (pre-existing warnings only).
- npm test — all TS tests pass; same 5 pre-existing storybook FAIL
  files (storybook cache export issue on ai/main, unrelated).
- dotnet test in c-sharp-tests — 704 passing, 6 skipped (same totals as
  before; the deleted tests are replaced by tighter coverage of the
  remaining GUID-only contract).

Wire compatibility note: this changes the JSON shape of the
`requestedTexts` argument to `IChecklistService.resolveComparativeTexts`.
The only producer is the markers-checklist web view in this repo, which
this commit updates in lockstep. No external consumer is affected.

Note: `.context/features/markers-checklist/data-contracts.md` §2.4 still
mentions the Name field. That doc lives in ai-prompts; per Rolf's
direction we are not opening an ai-prompts PR in this round, so the doc
will drift slightly until it's swept later.
@rolfheij-sil rolfheij-sil changed the title markers-checklist follow-up: TJ review feedback (TSDocs, type swaps, docstring fixes, @experimental) markers-checklist follow-up: TJ review feedback (TSDocs, type swaps, drop ComparativeTextRef.name, @experimental) May 11, 2026
CI's stricter prettier pass flagged the scope-selector.component.tsx
TSDocs I rewrote in commit 84e53a2 — prettier preferred different
line breaks across `—` em-dashes and `*not*` → `_not_` markdown
emphasis. Pure whitespace + markdown punctuation; no semantic change.

Also rebuilt platform-bible-react/dist/ to pick up the matching JSDoc
text in index.d.ts.

Local pre-commit hook didn't catch this because it runs `prettier
--write` on staged files only, but the format-check on CI runs across
the whole workspace and applies prettier with the prose-wrap rules
defined in lib/platform-bible-react/.prettierrc.
@rolfheij-sil rolfheij-sil changed the title markers-checklist follow-up: TJ review feedback (TSDocs, type swaps, drop ComparativeTextRef.name, @experimental) markers-checklist follow-up: TJ review + Sebastian UX-2 review (9 work packages) May 11, 2026
@rolfheij-sil rolfheij-sil force-pushed the ai/feature/markers-checklist-followup-rolf-05-11-2026 branch from e6d686f to 53580a9 Compare May 12, 2026 08:05
@rolfheij-sil rolfheij-sil changed the title markers-checklist follow-up: TJ review + Sebastian UX-2 review (9 work packages) markers-checklist follow-up: TJ review May 12, 2026
…ct fix

- ChecklistService: honor platform ScriptureRange contract — End == null now
  narrows to a single-verse range at Start (was: scan to last verse of project).
  No production caller triggers the changed branch; new regression test
  BuildChecklistData_VerseRangeEndOmitted_ScansSingleVerseAtStart covers it.
- platform-scripture.d.ts: tighten verseRange.end TSDoc to reference the
  canonical ScriptureRange semantics; document '' fallback on
  ResolvedComparativeTexts.texts[].name / fullName when available is false.
- LinkedScrRefButton: mirror the @experimental marker on the function itself
  so IDE / TypeDoc surfaces the warning at every call site (was: only on
  LinkedScrRefButtonProps).
- popover.tsx (PopoverPortalContainerProvider): rephrase JSDoc so the inline
  useState<HTMLElement | null>(null) reference lands mid-line and isn't
  reflowed across paragraphs by Prettier.
- Rename test ResolveComparativeTexts_MixedResolutionPaths_… →
  ResolveComparativeTexts_MixedAvailability_… (only one resolution path remains
  after name-fallback was removed).
- Regenerate lib/platform-bible-react/dist for the JSDoc / @experimental
  changes. Includes benign CSS reordering churn (build-tool non-determinism).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@rolfheij-sil rolfheij-sil changed the title markers-checklist follow-up: TJ review [P3] markers-checklist follow-up: TJ review May 13, 2026
@rolfheij-sil rolfheij-sil changed the title [P3] markers-checklist follow-up: TJ review [P3] markers-checklist: follow-up - TJ review May 13, 2026
@rolfheij-sil rolfheij-sil deleted the ai/feature/markers-checklist-followup-rolf-05-11-2026 branch May 13, 2026 12:53
@rolfheij-sil
Copy link
Copy Markdown
Contributor Author

Closed inadvertently when the head branch was renamed to the canonical ai/feature/markers-checklist-rolf-05-11-2026-followup via the GitHub branch-rename API. No reviews or comments had been posted on this PR.

Replaced by #2262 — same commits, same diff, canonical branch name so automated status reports pick it up.

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