Skip to content

feat(doc): emit typed error envelopes across the doc domain#1346

Merged
evandance merged 1 commit into
mainfrom
feat/errs-migrate-doc
Jun 9, 2026
Merged

feat(doc): emit typed error envelopes across the doc domain#1346
evandance merged 1 commit into
mainfrom
feat/errs-migrate-doc

Conversation

@evandance

@evandance evandance commented Jun 9, 2026

Copy link
Copy Markdown
Collaborator

Summary

Migrates typed error envelopes across the Doc shortcut domain. Scope is limited to shortcuts/doc, Doc error-contract guards, and Doc guard tests.

Changes

  • Converts Doc validation, media, clipboard, API, network, file, and invalid-response failures to typed errs.* envelopes.
  • Preserves structured params for user-fixable flags and typed API metadata through CallAPITyped / ProblemOf.
  • Adds Doc coverage to .golangci.yml and lint/errscontract so legacy envelopes and common helpers cannot regress.

Test Plan

  • gofmt -l <changed go files> produced no output
  • go vet ./shortcuts/doc/...
  • go test ./shortcuts/doc/...
  • go test -C lint ./...
  • go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.1.6 run --new-from-rev=origin/main ./shortcuts/doc/...
  • go run -C lint . ..
  • go build ./...

Related Issues

  • None

Summary by CodeRabbit

  • Improvements

    • Many doc-related commands now return structured, parameterized validation errors for clearer, actionable messages tied to specific flags.
    • Clipboard and media flows yield clearer validation errors and preserve underlying causes for network/save failures.
  • Bug Fixes

    • Linting rules expanded to cover additional doc paths to enforce migrated APIs.
  • Tests

    • Added contract tests ensuring validation error types, subtypes, and parameter metadata are produced consistently.

@evandance evandance added size/M Single-domain feat or fix with limited business impact domain/ccm PR touches the ccm domain feature labels Jun 9, 2026
@coderabbitai

coderabbitai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Migrates shortcuts/doc from legacy output helpers to typed errs, updates lint to mark shortcuts/doc as migrated, adds wrapDocNetworkErr, converts clipboard/media/docs validation and execution errors to errs types, upgrades API calls to CallAPITyped, and adds validation contract tests.

Changes

Typed Error Migration for shortcuts/doc

Layer / File(s) Summary
Linter configuration and rule updates
.golangci.yml, lint/errscontract/rule_no_legacy_common_helper_call.go, lint/errscontract/rule_no_legacy_envelope_literal.go, lint/errscontract/rules_test.go
Update golangci forbidigo exclusions and extend migrated-path sets and lint tests to include shortcuts/doc.
Doc network error wrapper
shortcuts/doc/doc_errors.go
Add wrapDocNetworkErr that preserves existing errs problems and wraps non-typed errors into a network-transport typed error with cause.
Clipboard image reading error migration
shortcuts/doc/clipboard.go
Platform clipboard readers now return errs.NewValidationError(SubtypeFailedPrecondition) for unsupported OS/empty/non-PNG data and attach causes where available; add nolint for retained fmt usage.
Media download and preview error migration
shortcuts/doc/doc_media_download.go, shortcuts/doc/doc_media_preview.go
Switch validation/network/save errors to typed errs with --token/--output param metadata; use wrapDocNetworkErr for network failures and common.WrapSaveErrorTyped for save errors.
Media upload and insert error migration
shortcuts/doc/doc_media_upload.go, shortcuts/doc/doc_media_insert.go
Migrate validations and execution errors to typed errs, upgrade several runtime API calls to CallAPITyped, convert internal failures to errs.NewInternalError, and preserve rollback-warning behavior.
Document command validation migration
shortcuts/doc/docs_create_v2.go, shortcuts/doc/docs_fetch_v2.go, shortcuts/doc/docs_search.go, shortcuts/doc/docs_update_v2.go
Replace legacy flag/validation helpers with errs.NewValidationError(...).WithParam(...) and attach parse/parse-value causes where applicable; upgrade API call(s) to CallAPITyped.
Helpers and v2-only validation
shortcuts/doc/helpers.go, shortcuts/doc/v2_only.go
Document-ref parsing and v2-only checks now return typed validation/internal errors; doDocAPI uses CallAPITyped; marshaling failures return errs.NewInternalError with cause; v2-only error attaches Param when provided.
Doc validation contract tests
shortcuts/doc/doc_errors_test.go
Add table-driven tests and helpers asserting *errs.ValidationError contracts for create/fetch/update/DocMediaInsert validations.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • larksuite/cli#1291: Also modifies shortcuts/doc/docs_fetch_v2.go and adds v2-only prevalidation plumbing relevant to fetch validation.
  • larksuite/cli#1232: Expands migrated-path prefixes and adjusts forbidigo scoping for another shortcut domain.
  • larksuite/cli#1242: Related lint/rule changes extending migrated paths and tests for errscontract rules.

Suggested labels

size/L

Suggested reviewers

  • liangshuo-1
  • fangshuyu-768
  • chanthuang

"I'm a rabbit with a linting pen,
Swapped fmt for errs again and again,
Clipboard, media, docs aligned,
Network wraps and params combined,
Tests hop in to keep the garden fine. 🐇"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 41.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat(doc): emit typed error envelopes across the doc domain' accurately and concisely describes the main objective of the PR: migrating to typed error envelopes in the Doc domain.
Description check ✅ Passed The PR description follows the template structure with Summary, Changes, Test Plan, and Related Issues sections, providing clear details about the migration scope, what was converted, and verification steps.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/errs-migrate-doc

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 and usage tips.

@codecov

codecov Bot commented Jun 9, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 68.49315% with 46 lines in your changes missing coverage. Please review.
✅ Project coverage is 71.90%. Comparing base (2b4c634) to head (4f2d885).

Files with missing lines Patch % Lines
shortcuts/doc/doc_media_insert.go 66.07% 19 Missing ⚠️
shortcuts/doc/clipboard.go 42.85% 8 Missing ⚠️
shortcuts/doc/doc_media_download.go 33.33% 4 Missing ⚠️
shortcuts/doc/doc_media_preview.go 33.33% 4 Missing ⚠️
shortcuts/doc/docs_fetch_v2.go 66.66% 4 Missing ⚠️
shortcuts/doc/helpers.go 40.00% 3 Missing ⚠️
shortcuts/doc/doc_media_upload.go 0.00% 2 Missing ⚠️
shortcuts/doc/docs_search.go 83.33% 1 Missing ⚠️
shortcuts/doc/docs_update_v2.go 93.75% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1346      +/-   ##
==========================================
+ Coverage   71.79%   71.90%   +0.11%     
==========================================
  Files         690      691       +1     
  Lines       65578    65611      +33     
==========================================
+ Hits        47080    47177      +97     
+ Misses      14843    14789      -54     
+ Partials     3655     3645      -10     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown

🚀 PR Preview Install Guide

🧰 CLI update

npm i -g https://pkg.pr.new/larksuite/cli/@larksuite/cli@4f2d885d1f77cbb48128c6c3e5731535ed559fd2

🧩 Skill update

npx skills add larksuite/cli#feat/errs-migrate-doc -y -g

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@shortcuts/doc/clipboard.go`:
- Line 242: The validation error returned for the clipboard read should preserve
the original exec error like the other cases; replace the current return of
errs.NewValidationError(...) with the same call chained with .WithCause(err) so
the returned error includes the underlying `err` (matching the pattern used at
the Linux and Windows decode locations).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ec59d40f-3128-453d-9ecb-38dccb90c836

📥 Commits

Reviewing files that changed from the base of the PR and between 03ea6e7 and 08803dc.

📒 Files selected for processing (16)
  • .golangci.yml
  • lint/errscontract/rule_no_legacy_common_helper_call.go
  • lint/errscontract/rule_no_legacy_envelope_literal.go
  • lint/errscontract/rules_test.go
  • shortcuts/doc/clipboard.go
  • shortcuts/doc/doc_errors.go
  • shortcuts/doc/doc_media_download.go
  • shortcuts/doc/doc_media_insert.go
  • shortcuts/doc/doc_media_preview.go
  • shortcuts/doc/doc_media_upload.go
  • shortcuts/doc/docs_create_v2.go
  • shortcuts/doc/docs_fetch_v2.go
  • shortcuts/doc/docs_search.go
  • shortcuts/doc/docs_update_v2.go
  • shortcuts/doc/helpers.go
  • shortcuts/doc/v2_only.go

Comment thread shortcuts/doc/clipboard.go Outdated
@evandance evandance force-pushed the feat/errs-migrate-doc branch from 08803dc to 17490ef Compare June 9, 2026 07:44

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@shortcuts/doc/docs_search.go`:
- Around line 162-164: The JSON unmarshal error is being discarded; preserve the
original parse error by attaching it as the cause when returning the validation
error. In the block that calls json.Unmarshal([]byte(filterStr), &filter) and
returns errs.NewValidationError(...).WithParam("--filter"), chain the original
err using .WithCause(err) on the returned validation error (keeping the existing
message and .WithParam("--filter")) so the error chain and parse details
(line/column, type mismatch) are preserved.
- Around line 226-239: The validation errors returned when toUnixSeconds fails
should attach the original parse error as a cause; update the error
constructions in the start and end branches (the NewValidationError(...) calls
that are returned) to call .WithCause(err) before .WithParam("--filter") so the
error chain preserves the original toUnixSeconds error for both the start and
end handling (look for rangeMap["start"]/rangeMap["end"], toUnixSeconds,
NewValidationError, WithParam, and result assignments).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0b03c7b2-3681-4c3a-a4d5-171f47f6bc73

📥 Commits

Reviewing files that changed from the base of the PR and between 08803dc and 17490ef.

📒 Files selected for processing (16)
  • .golangci.yml
  • lint/errscontract/rule_no_legacy_common_helper_call.go
  • lint/errscontract/rule_no_legacy_envelope_literal.go
  • lint/errscontract/rules_test.go
  • shortcuts/doc/clipboard.go
  • shortcuts/doc/doc_errors.go
  • shortcuts/doc/doc_media_download.go
  • shortcuts/doc/doc_media_insert.go
  • shortcuts/doc/doc_media_preview.go
  • shortcuts/doc/doc_media_upload.go
  • shortcuts/doc/docs_create_v2.go
  • shortcuts/doc/docs_fetch_v2.go
  • shortcuts/doc/docs_search.go
  • shortcuts/doc/docs_update_v2.go
  • shortcuts/doc/helpers.go
  • shortcuts/doc/v2_only.go
✅ Files skipped from review due to trivial changes (1)
  • lint/errscontract/rule_no_legacy_envelope_literal.go
🚧 Files skipped from review as they are similar to previous changes (14)
  • lint/errscontract/rule_no_legacy_common_helper_call.go
  • shortcuts/doc/docs_create_v2.go
  • shortcuts/doc/doc_media_upload.go
  • shortcuts/doc/doc_media_preview.go
  • shortcuts/doc/doc_errors.go
  • shortcuts/doc/docs_update_v2.go
  • shortcuts/doc/clipboard.go
  • shortcuts/doc/helpers.go
  • lint/errscontract/rules_test.go
  • shortcuts/doc/docs_fetch_v2.go
  • shortcuts/doc/v2_only.go
  • shortcuts/doc/doc_media_download.go
  • .golangci.yml
  • shortcuts/doc/doc_media_insert.go

Comment thread shortcuts/doc/docs_search.go
Comment thread shortcuts/doc/docs_search.go
@evandance evandance force-pushed the feat/errs-migrate-doc branch 3 times, most recently from 0d0c88f to 0dc555d Compare June 9, 2026 08:16

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
shortcuts/doc/doc_media_insert.go (1)

700-759: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Return invalid-response errors for malformed ancestor walks.

When this walk stops because of a cycle, a self-parent, or a fetched block with no parent_id, it falls through to the --selection-with-ellipsis validation error. That blames user input for a malformed doc/MCP response and flips the shell exit category from internal to validation. Keep the final validation fallback for a genuine “match is outside the root tree” case, but short-circuit the malformed-walk branches with errs.NewInternalError(errs.SubtypeInvalidResponse, ...).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@shortcuts/doc/doc_media_insert.go` around lines 700 - 759, The ancestor-walk
currently falls through to errs.NewValidationError even when the loop stopped
because of a cycle or malformed parent info; update the loop to short-circuit
those malformed-walk cases and return
errs.NewInternalError(errs.SubtypeInvalidResponse, ...) instead. Concretely:
detect the failure reasons (visited[cur] cycle, parent == cur self-parent,
parent == "" after the runtime.CallAPITyped fetch, or exceeding maxDepth) using
the existing symbols (visited, cur, parent, nextParent, walkDepth, maxDepth,
runtime.CallAPITyped) and return an internal-invalid-response error with a clear
message when any of those conditions occur; keep the existing
errs.NewValidationError only for the genuine “match is outside the root tree”
fallback when the block was properly traversed but not found in rootSet.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@shortcuts/doc/doc_errors_test.go`:
- Around line 22-52: The test helper docValidateRuntime currently creates fresh
cobra flags with empty defaults, losing real-command defaults (e.g., the --type
default in shortcuts/doc/doc_media_insert.go) and causing false negatives;
modify docValidateRuntime to either register flags by copying the mounted
command's flags (use cmd.Flags() from the real command and Clone or Iterate to
attach defaults) or explicitly seed each flag's default value before calling
fs.Set — locate docValidateRuntime and change the flag registration logic so it
reads defaults from the real command's flag definitions (or accepts a map of
defaults) instead of always using ""/0/false so validators see the same defaults
as the production commands.

---

Outside diff comments:
In `@shortcuts/doc/doc_media_insert.go`:
- Around line 700-759: The ancestor-walk currently falls through to
errs.NewValidationError even when the loop stopped because of a cycle or
malformed parent info; update the loop to short-circuit those malformed-walk
cases and return errs.NewInternalError(errs.SubtypeInvalidResponse, ...)
instead. Concretely: detect the failure reasons (visited[cur] cycle, parent ==
cur self-parent, parent == "" after the runtime.CallAPITyped fetch, or exceeding
maxDepth) using the existing symbols (visited, cur, parent, nextParent,
walkDepth, maxDepth, runtime.CallAPITyped) and return an
internal-invalid-response error with a clear message when any of those
conditions occur; keep the existing errs.NewValidationError only for the genuine
“match is outside the root tree” fallback when the block was properly traversed
but not found in rootSet.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f044e6bf-15ae-4a93-90b0-3e2d1c1d6d3e

📥 Commits

Reviewing files that changed from the base of the PR and between 82d2a29 and 0d0c88f.

📒 Files selected for processing (17)
  • .golangci.yml
  • lint/errscontract/rule_no_legacy_common_helper_call.go
  • lint/errscontract/rule_no_legacy_envelope_literal.go
  • lint/errscontract/rules_test.go
  • shortcuts/doc/clipboard.go
  • shortcuts/doc/doc_errors.go
  • shortcuts/doc/doc_errors_test.go
  • shortcuts/doc/doc_media_download.go
  • shortcuts/doc/doc_media_insert.go
  • shortcuts/doc/doc_media_preview.go
  • shortcuts/doc/doc_media_upload.go
  • shortcuts/doc/docs_create_v2.go
  • shortcuts/doc/docs_fetch_v2.go
  • shortcuts/doc/docs_search.go
  • shortcuts/doc/docs_update_v2.go
  • shortcuts/doc/helpers.go
  • shortcuts/doc/v2_only.go
🚧 Files skipped from review as they are similar to previous changes (15)
  • lint/errscontract/rule_no_legacy_envelope_literal.go
  • shortcuts/doc/doc_errors.go
  • shortcuts/doc/docs_search.go
  • shortcuts/doc/helpers.go
  • shortcuts/doc/doc_media_preview.go
  • lint/errscontract/rule_no_legacy_common_helper_call.go
  • shortcuts/doc/docs_create_v2.go
  • shortcuts/doc/docs_update_v2.go
  • shortcuts/doc/doc_media_download.go
  • shortcuts/doc/clipboard.go
  • .golangci.yml
  • shortcuts/doc/docs_fetch_v2.go
  • shortcuts/doc/doc_media_upload.go
  • lint/errscontract/rules_test.go
  • shortcuts/doc/v2_only.go

Comment thread shortcuts/doc/doc_errors_test.go

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@shortcuts/doc/doc_errors.go`:
- Line 15: Add a unit test that exercises the untyped-network wrapping branch by
calling wrapDocNetworkErr with a raw error value and verifying the returned
error is a NetworkError with errs.SubtypeNetworkTransport and that the original
error is preserved as the cause (i.e., the result of .WithCause(err) is
present); specifically, create a test that calls wrapDocNetworkErr(err) where
err is a plain errors.New(...) and assert the subtype equals
errs.SubtypeNetworkTransport and that errors.Is/Unwrap (or the
NetworkError.Cause accessor) returns the original error to prevent regressions
in the errs.NewNetworkError(...).WithCause(err) path.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 796db4c2-1cdc-4a4d-a1dc-178f91786281

📥 Commits

Reviewing files that changed from the base of the PR and between 0d0c88f and 0dc555d.

📒 Files selected for processing (17)
  • .golangci.yml
  • lint/errscontract/rule_no_legacy_common_helper_call.go
  • lint/errscontract/rule_no_legacy_envelope_literal.go
  • lint/errscontract/rules_test.go
  • shortcuts/doc/clipboard.go
  • shortcuts/doc/doc_errors.go
  • shortcuts/doc/doc_errors_test.go
  • shortcuts/doc/doc_media_download.go
  • shortcuts/doc/doc_media_insert.go
  • shortcuts/doc/doc_media_preview.go
  • shortcuts/doc/doc_media_upload.go
  • shortcuts/doc/docs_create_v2.go
  • shortcuts/doc/docs_fetch_v2.go
  • shortcuts/doc/docs_search.go
  • shortcuts/doc/docs_update_v2.go
  • shortcuts/doc/helpers.go
  • shortcuts/doc/v2_only.go
✅ Files skipped from review due to trivial changes (3)
  • lint/errscontract/rule_no_legacy_envelope_literal.go
  • lint/errscontract/rule_no_legacy_common_helper_call.go
  • .golangci.yml
🚧 Files skipped from review as they are similar to previous changes (8)
  • shortcuts/doc/docs_fetch_v2.go
  • shortcuts/doc/docs_update_v2.go
  • shortcuts/doc/helpers.go
  • shortcuts/doc/v2_only.go
  • shortcuts/doc/docs_search.go
  • lint/errscontract/rules_test.go
  • shortcuts/doc/doc_errors_test.go
  • shortcuts/doc/docs_create_v2.go

Comment thread shortcuts/doc/doc_errors.go
@evandance evandance force-pushed the feat/errs-migrate-doc branch 2 times, most recently from 058fa5d to dc3c63e Compare June 9, 2026 09:25
Emit structured validation, API, network, file, and internal error envelopes for Doc shortcuts so users and agents can recover from failed document workflows using stable type, subtype, param, and code fields.

Add Doc domain errscontract and golangci guards to prevent legacy envelope and common helper regressions.
@evandance evandance force-pushed the feat/errs-migrate-doc branch from dc3c63e to 4f2d885 Compare June 9, 2026 10:00
@github-actions github-actions Bot added size/L Large or sensitive change across domains or core paths and removed size/M Single-domain feat or fix with limited business impact labels Jun 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

domain/ccm PR touches the ccm domain feature size/L Large or sensitive change across domains or core paths

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants