Skip to content

fix: enforce final archive confirmation#184

Merged
benym merged 3 commits into
rpamis:beta4from
chenqinggang001:feat-archive-confirmation-guard
Jul 11, 2026
Merged

fix: enforce final archive confirmation#184
benym merged 3 commits into
rpamis:beta4from
chenqinggang001:feat-archive-confirmation-guard

Conversation

@chenqinggang001

@chenqinggang001 chenqinggang001 commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Summary

  • persist final archive approval as machine-owned archive_confirmation state
  • require the confirmation transition before mutating archive execution while preserving interrupted-archive recovery
  • route resolver, runtime evidence, recovery output, generated runtime, and regression coverage through the new state
  • synchronize Chinese and English archive Skill guidance and update the existing 0.4.0-beta.4 changelog entry
  • format the managed Markdown helper so the release format check passes

Why

The archive Skill paused for user confirmation, but the mutating archive command only checked the phase and verification result. A direct script invocation could therefore bypass the required final decision point. Recording approval through a machine-owned transition makes the decision auditable and enforces it at the command boundary.

Impact

Users must confirm archiving through archive-confirm before Comet merges delta specs or moves a change. Reopening the archive phase clears the approval so stale confirmation cannot be reused, while already-started archive recovery remains resumable.

Validation

  • pnpm format:check
  • pnpm lint
  • pnpm build
  • pnpm test — 108 test files and 1112 tests passed

Summary by Sourcery

Enforce a machine-owned archive confirmation state in the Classic workflow and require it before any mutating archive execution, while preserving archive recovery behavior.

New Features:

  • Introduce an archive_confirmation field and archive-confirm transition in Classic state to capture the final archive decision.
  • Expose archive confirmation status in recovery output and classic evidence, and derive archive-related routing from Classic state instead of runtime evidence.

Bug Fixes:

  • Block direct archive commands and transitions unless archive_confirmation is confirmed, preventing bypass of the required final confirmation step.
  • Reset archive_confirmation when reopening the archive phase so stale confirmations cannot be reused, and allow recovery flows to complete when confirmation was previously missing.

Enhancements:

  • Treat archive_confirmation as a machine-owned field across state commands and validation, and extend enums, wire keys, and projections accordingly.
  • Clarify and synchronize English and Chinese archive Skill documentation around the required archive-confirm step and archive entry conditions.
  • Tidy managed Markdown helper formatting and benchmark scripts to satisfy formatting and regression baselines.

Documentation:

  • Document the new archive_confirmation field and archive-confirm behavior in English and Chinese reference docs and archive Skill guides, and update the 0.4.0-beta.4 changelog entry.

Tests:

  • Extend Classic resolver, evidence, archive command, scripts, recovery, migration, and contract tests to cover archive_confirmation behavior, archive-confirm transition enforcement, and recovery messaging.

Summary by CodeRabbit

  • New Features

    • Added an explicit archive confirmation step before archive actions can run.
    • Archive status now clearly reports whether final confirmation is pending or complete.
    • Added safeguards preventing archive execution until confirmation succeeds.
  • Bug Fixes

    • Improved archive recovery guidance when confirmation is incomplete.
    • Reopening an archive resets its confirmation status.
  • Documentation

    • Documented the new archive confirmation field, lifecycle, and required command sequence.
    • Updated release notes with the archive confirmation enforcement change.

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

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

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

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9a4646b2-40f3-466d-8d44-55335b29be93

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The Classic archive lifecycle now stores machine-owned archive_confirmation state, adds an archive-confirm transition, requires confirmed state before mutation, updates recovery behavior, and aligns documentation, benchmarks, and tests with the transition-first archive protocol.

Changes

Classic archive confirmation

Layer / File(s) Summary
Archive confirmation state contract
domains/comet-classic/classic-state.ts, domains/comet-classic/classic-state-command.ts, assets/skills/comet/scripts/comet-runtime.mjs
Adds nullable archive_confirmation state, enum validation, YAML serialization, initialization, CLI wiring, and machine-owned field protection.
Archive confirmation transitions
domains/comet-classic/classic-transitions.ts, assets/skills/comet/scripts/comet-runtime.mjs
Adds archive-confirm, sets pending after verify-pass, sets confirmed after final confirmation, clears on reopen, and gates archived transitions.
Archive command and resolver flow
domains/comet-classic/classic-archive.ts, domains/comet-classic/classic-resolver.ts, domains/comet-classic/classic-evidence.ts, assets/comet/...
Requires confirmed state before archive mutation, resolves archive execution from Classic state, exposes confirmation evidence, and updates recovery handling.
Behavior and regression coverage
test/domains/comet-classic/*, scripts/benchmark/classic-baseline-regression.mjs
Covers confirmation gating, lifecycle transitions, recovery output, resolver behavior, archive failures, and updated archive fixtures.
Workflow documentation and support updates
assets/skills*/**, assets/skills/comet/reference/*, CHANGELOG.md, domains/skill/managed-markdown.ts
Documents the transition-first archive protocol and state field, updates release notes and benchmark setup, and reformats internal code.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant CometState
  participant ClassicArchive
  participant ClassicState
  Operator->>CometState: transition change archive-confirm
  CometState->>ClassicState: store archive_confirmation=confirmed
  Operator->>ClassicArchive: execute archive command
  ClassicArchive->>ClassicState: validate confirmation
  ClassicArchive->>ClassicState: apply archived transition
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: requiring a final archive confirmation before archive execution.
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 unit tests (beta)
  • Create PR with unit tests

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.

@sourcery-ai

sourcery-ai Bot commented Jul 10, 2026

Copy link
Copy Markdown

Reviewer's Guide

Introduces a machine-owned archive_confirmation field and archive-confirm transition into the Classic state machine, wires it through CLI/state commands, resolver, runtime, and recovery flows, and enforces that both the archived transition and /comet-archive mutating work require a confirmed final approval, while updating docs, tests, benchmarks, and formatting accordingly.

Sequence diagram for enforcing archive confirmation in /comet-archive

sequenceDiagram
  actor User
  participant CometArchiveSkill as CometArchiveSkill
  participant classicArchiveCommand as classicArchiveCommand
  participant ClassicStateMachine as applyClassicTransition

  User->>CometArchiveSkill: invoke /comet-archive
  CometArchiveSkill->>classicArchiveCommand: classicArchiveCommand(args)
  classicArchiveCommand->>classicArchiveCommand: validate runtime.run.pending
  classicArchiveCommand->>classicArchiveCommand: check classic.archiveConfirmation
  alt archiveConfirmation not confirmed and not recovering
    classicArchiveCommand-->>User: ArchiveFailure (archive_confirmation not confirmed)
  else archiveConfirmation confirmed or recovering
    classicArchiveCommand->>ClassicStateMachine: applyClassicTransition(classic, archived)
    ClassicStateMachine-->>classicArchiveCommand: classic.archived=true
    classicArchiveCommand-->>User: archive completed
  end
Loading

State diagram for Classic archive confirmation flow

stateDiagram-v2
  [*] --> build
  build --> verify: verify-pass
  verify --> archive: verify-pass

  state archive {
    [*] --> archive_pending
    archive_pending --> archive_confirmed: archive-confirm
    archive_pending --> verify: archive-reopen
    archive_confirmed --> archived: archived
  }

  archived --> [*]

  note "verify-pass: set phase=archive, archiveConfirmation=pending" as N1
  note "archive-confirm: require verifyResult=pass, archived=false; set archiveConfirmation=confirmed" as N2
  note "archive-reopen: require archived=false; set verifyResult=pending, phase=verify, verifiedAt=null, archiveConfirmation=null" as N3
  note "archived: require verifyResult=pass and archiveConfirmation=confirmed; set archived=true" as N4
Loading

File-Level Changes

Change Details Files
Add archive_confirmation field and archive-confirm transition to Classic state and transition model, treating it as machine-owned.
  • Extend ClassicState with archiveConfirmation enum and wire it into CLASSIC_WIRE_KEYS, projections, validation, and enums
  • Introduce ARCHIVE_CONFIRMATIONS enum values and include archive_confirmation in YAML/JSON serialization/deserialization
  • Add archive-confirm to CLASSIC_TRANSITION_EVENTS/TABLE and implement its behavior in applyClassicTransition, including setting archiveConfirmation to pending on verify-pass, confirmed on archive-confirm, and clearing it on archive-reopen
  • Update archived transition guards to require archive-confirmed state in addition to verify_result=pass
domains/comet-classic/classic-state.ts
domains/comet-classic/classic-transitions.ts
assets/skills/comet/scripts/comet-runtime.mjs
domains/comet-classic/classic-validate-command.ts
test/domains/comet-classic/classic-state.test.ts
test/domains/comet-classic/classic-migrate.test.ts
Expose archive_confirmation to CLI state commands and enforce machine-owned protections and transition preconditions at the command layer.
  • Add archive_confirmation to MACHINE_OWNED_FIELDS, FIELD_ENUMS, CLASSIC_FIELD_WIRE_NAMES, and sparseClassicState projections for the classic-state-command CLI
  • Initialize archive_confirmation as null on init and include it in validation enums
  • Tighten setField/setField2 error messages and prevent direct setting of archive_confirmation without machineOwned option
  • Add archive-confirm transition handling to the CLI transition command, including phase, verify_result, and already-archived checks, and require archive_confirmation=confirmed before archived transition
  • Update recoverArchive output to include archive_confirmation and branch recovery messaging based on its value
domains/comet-classic/classic-state-command.ts
assets/skills/comet/scripts/comet-runtime.mjs
test/domains/comet-classic/comet-scripts.test.ts
test/domains/comet-classic/comet-scripts-recovery.test.ts
Make /comet-archive enforce final archive confirmation while keeping archive recovery resumable.
  • Guard classicArchiveCommand to fail mutating runs when archiveConfirmation is not confirmed unless in recovery mode
  • During recovery, coerce archiveConfirmation to confirmed before applying the archived transition to maintain invariants
  • Add new archive command tests that ensure archive fails without confirmation, succeeds after archive-confirm, remains idempotent on retry, and preserves recovery semantics
  • Update benchmark regression archiveRecoveryScenario to include an archive-confirm transition before simulating an interrupted archive
domains/comet-classic/classic-archive.ts
assets/skills/comet/scripts/comet-runtime.mjs
scripts/benchmark/classic-baseline-regression.mjs
test/domains/comet-classic/classic-archive.test.ts
Drive archive step resolution and evidence from Classic state archive_confirmation instead of runtime-only evidence.
  • Extend collectClassicEvidence to emit archive.confirmed evidence based on classic.archiveConfirmation
  • Refactor resolveArchive to read classic.archiveConfirmation directly and drop its evidence parameter
  • Update resolver tests and projections to include archiveConfirmation defaults and expectations
  • Adjust runtime evidence collection to include archive.confirmed and keep other evidence behaviors unchanged
domains/comet-classic/classic-evidence.ts
domains/comet-classic/classic-resolver.ts
assets/skills/comet/scripts/comet-runtime.mjs
test/domains/comet-classic/classic-evidence.test.ts
test/domains/comet-classic/classic-resolver.test.ts
Align tests, recovery flows, and contracts with the new archive_confirmation behavior.
  • Seed and expectation updates in script tests to include archive_confirmation in YAML fixtures and outputs
  • Add tests ensuring archive-confirm cannot be applied in wrong phases, before verify_result=pass, or after already archived, and that archive-reopen clears archiveConfirmation
  • Update recovery check output tests to assert archive_confirmation status and new guidance strings
  • Adjust contract tests and legacy projections to tolerate archive-confirm in event lists and archive_confirmation in projected documents
test/domains/comet-classic/comet-scripts.test.ts
test/domains/comet-classic/comet-scripts-recovery.test.ts
test/domains/comet-classic/classic-contract.test.ts
Document archive_confirmation semantics and required archive-confirm usage in English and Chinese docs and changelog.
  • Update English and Chinese archive Skill docs to show archive-confirm transition before running /comet-archive and to include archive_confirmation in entry validation requirements
  • Document archive_confirmation field semantics, lifecycle, and machine-owned constraints in comet-yaml reference docs (EN and ZH)
  • Amend 0.4.0-beta.4 changelog with new date and an entry describing archive confirmation enforcement
assets/skills/comet-archive/SKILL.md
assets/skills-zh/comet-archive/SKILL.md
assets/skills/comet/reference/comet-yaml-fields.md
assets/skills-zh/comet/reference/comet-yaml-fields.md
CHANGELOG.md
Minor formatting and helper changes to keep managed Markdown and benchmarks passing.
  • Reformat managed-markdown helper to satisfy formatter expectations without changing behavior
  • Reformat benchmark classic-baseline-regression JSON reading for readability without logic changes
domains/skill/managed-markdown.ts
scripts/benchmark/classic-baseline-regression.mjs

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@chenqinggang001 chenqinggang001 marked this pull request as ready for review July 10, 2026 10:29

@sourcery-ai sourcery-ai 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.

Hey - I've reviewed your changes and they look great!


Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@benym

benym commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@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 `@assets/skills-zh/comet-archive/SKILL.md`:
- Around line 41-54: 避免重复执行 archive-confirm:在用户选择“确认归档”后立即调用一次 transition
<change-name> archive-confirm,并记录或处理其失败结果;调整“执行归档”步骤,使其仅调用 COMET_ARCHIVE
归档脚本,不再重复执行该 transition。

In `@assets/skills/comet-archive/SKILL.md`:
- Around line 41-54: Remove the duplicate archive-confirm execution from Step 2.
Keep the transition triggered by the “Confirm archive” selection, and have Step
2 run only the archive script after that transition succeeds; update the
surrounding instructions and command example to avoid directing agents to invoke
archive-confirm twice.
🪄 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: 918ec38d-791b-4489-9182-07e1161c22ed

📥 Commits

Reviewing files that changed from the base of the PR and between 6c364af and edd339b.

📒 Files selected for processing (23)
  • CHANGELOG.md
  • assets/skills-zh/comet-archive/SKILL.md
  • assets/skills-zh/comet/reference/comet-yaml-fields.md
  • assets/skills/comet-archive/SKILL.md
  • assets/skills/comet/reference/comet-yaml-fields.md
  • assets/skills/comet/scripts/comet-runtime.mjs
  • domains/comet-classic/classic-archive.ts
  • domains/comet-classic/classic-evidence.ts
  • domains/comet-classic/classic-resolver.ts
  • domains/comet-classic/classic-state-command.ts
  • domains/comet-classic/classic-state.ts
  • domains/comet-classic/classic-transitions.ts
  • domains/comet-classic/classic-validate-command.ts
  • domains/skill/managed-markdown.ts
  • scripts/benchmark/classic-baseline-regression.mjs
  • test/domains/comet-classic/classic-archive.test.ts
  • test/domains/comet-classic/classic-contract.test.ts
  • test/domains/comet-classic/classic-evidence.test.ts
  • test/domains/comet-classic/classic-migrate.test.ts
  • test/domains/comet-classic/classic-resolver.test.ts
  • test/domains/comet-classic/classic-state.test.ts
  • test/domains/comet-classic/comet-scripts-recovery.test.ts
  • test/domains/comet-classic/comet-scripts.test.ts

Comment thread assets/skills-zh/comet-archive/SKILL.md Outdated
Comment thread assets/skills/comet-archive/SKILL.md Outdated
@benym

benym commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

LGTM, thanks for your contribution.

@benym benym merged commit 8abe7fb into rpamis:beta4 Jul 11, 2026
3 checks passed
@coderabbitai coderabbitai Bot mentioned this pull request Jul 11, 2026
21 tasks
benym added a commit that referenced this pull request Jul 12, 2026
* docs: add Comet ambient resume design

* docs: add Comet ambient resume implementation plan

* docs: fix ambient resume plan fixture

* feat: add ambient resume probe logic

* fix: align ambient resume probe with classic diagnostics

* docs: mark ambient resume task 1 complete

* feat: expose ambient resume in classic runtime

* fix: harden ambient resume classic command tests

* chore: keep ambient resume sdd reports untracked

* docs: mark ambient resume task 2 complete

* feat: add ambient resume CLI

* fix: cover ambient resume CLI plumbing

* docs: mark ambient resume task 3 complete

* feat: add managed project instruction blocks

* fix: harden managed markdown block merging

* fix: preserve managed markdown line endings

* docs: mark ambient resume task 4 complete

* feat: inject ambient resume project instructions

* fix: tighten ambient resume project instruction scope

* fix: stabilize ambient resume json summaries

* docs: mark ambient resume task 5 complete

* docs: document ambient resume workflow

* docs: refine ambient resume wording

* fix: harden ambient resume probe

* docs: clarify ambient resume recovery command

* fix: resolve dashboard issue 170

* fix: clarify archived dashboard terminal state

* fix: preserve existing skill dirs in symlink mode

* fix: install openspec cli globally during init

* fix: resolve archived dashboard superpowers artifacts

* docs: add project installation registry design

* docs: add project installation registry plan

* feat: add project installation registry

* fix: reject invalid project registry targets

* docs: mark project registry task complete

* feat: add project scope selection helper

* docs: mark project scope helper task complete

* feat: record project installs during init

* docs: mark init registry task complete

* feat: update all indexed projects

* docs: mark update registry task complete

* feat: uninstall all indexed projects

* fix: keep forced project scope local

* docs: mark uninstall registry task complete

* docs: update changelog for project registry

* fix: harden all-project registry operations

* fix(registry): harden all-project update failures

* fix: enforce final archive confirmation (#184)

* fix: enforce final archive confirmation

* chore: format managed markdown helper

* fix: run archive confirmation once

---------

Co-authored-by: chenqinggang <chenqinggang@ulearning.cn>

* docs: add npm eval harness design

* fix(eval): bundle npm eval harness

* fix(eval): use bundled harness by default

* docs: add npm eval harness plan

* docs: add eval draft hash runtime design

* fix(eval): resolve generated draft hashes

* fix(eval): contextualize draft hash failures

* fix(eval): prepare generated manifests at runtime

* fix(eval): preserve primary manifest errors

* test(eval): cover undefined primary failures

* docs: add eval draft hash runtime plan

* docs: add classic reliability CLI design

* docs: add classic reliability CLI plan

* fix(classic): preserve archive markdown formatting

* docs: check off archive formatting task

* feat(cli): expose stable Classic commands

* docs: check off stable Classic CLI task

* feat(classic): record command check evidence

* fix(classic): validate stored command check cwd

* fix(classic): ignore malformed command check data

* docs: check off command evidence task

* fix(classic): support recorded build checks

* fix(classic): preserve verify command rejection

* docs: check off Guard evidence task

* feat(status): classify OpenSpec and Comet changes

* docs: check off mixed status task

* docs(zh): use stable Classic CLI commands

* test(skill): align stable Classic commands

* docs: check off Chinese Skill task

* docs: document stable Classic command workflows

* docs: classify Classic reliability changes

* docs: check off Classic reliability implementation

* fix(classic): keep status and evidence recording read-only

* fix(classic): validate runtime runs without mutation

* docs: complete Classic reliability plan

* test(skill): format stable command assertions

* docs: design Codex agents skills migration

* docs: plan Codex agents skills migration

* fix(codex): use agents skill discovery roots

* test(codex): cover agents skill installation

* fix(codex): migrate legacy skill installations

* fix(codex): harden legacy skill migration

* fix(codex): protect linked skill removals

* test(codex): finalize agents skill migration

* test(codex): clean remaining legacy skill fixtures

* test(codex): use canonical plugin detection fixture

* fix(codex): preserve configuration and shared skill roots

* fix(codex): propagate cleanup failures

* ci: align beta4 checks with current runtime

* docs: complete classic transition reference

* fix: address beta4 review findings

* docs: design current change hook binding

* docs: plan current change hook binding

* feat(classic): persist current change selection

* docs: keep guard fix in beta4

* feat(classic): expose current change commands

* fix(classic): scope source guard to current change

* docs(classic): bind phase skills to current change

* fix(classic): preserve hook resolution type

* docs(classic): rebind change after isolation

* fix(classic): preserve guard recovery allowlists

* docs: note current change guard fix

* docs: add Comet documentation badge

* docs: refine README badge layout

* Revert "docs: refine README badge layout"

This reverts commit 859b6d9.

---------

Co-authored-by: chenqinggang001 <74290987+chenqinggang001@users.noreply.github.com>
Co-authored-by: chenqinggang <chenqinggang@ulearning.cn>
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.

2 participants