- Any enforced reject: the version goes back to “changes requested”; fix it and resubmit (at most 10 scans per version). A reject in the validating phase skips the scanning phase.
- Any enforced quarantine: human review.
- Evaluation rules are only recorded in the report (with the outcome they would have had) and do not affect the result; record-only rules are notices or summaries.
- The operator can allow-list or block-list file hashes: findings on allow-listed files drop to record-only (except the block rule and scanner faults); block-listed files are rejected (package.blocked_file).
Developer platform
Review rules
Every rule of the market review worker, exported from the review engine code.
m3.1 · 100 rules
How the outcome is decided
When a human reviewer is required
With no reject finding, any one of these sends the version to human review; otherwise it is approved directly:
first_version: The first version (no reviewed version yet)permission_change: Permissions differ from the last reviewed versionprivileged: Privileged kinds: engine_module, module, providerprobation: The seller is within probation (market default 90 days, adjustable by the operator)quarantine: Any enforced quarantine finding (scanner faults included)scan_failed: Three scan attempts in a row errored
Manifest and version (metadata)
| Rule ID | Severity | Outcome | Mode | Description |
|---|---|---|---|---|
metadata.description_missing | Low | Record only | Enforced | The manifest has no zh-CN description (notice only) |
metadata.identity_mismatch | High | Reject | Enforced | The manifest id or version differs from the uploaded version |
metadata.license_missing | Low | Record only | Enforced | The plugin declares no SPDX licence (notice only) |
metadata.manifest_invalid | High | Reject | Enforced | The manifest is not a valid marketplace.cdnca.io/v1 Plugin document |
metadata.manifest_packages | High | Reject | Evaluation (recorded only) | The manifest spec.packages does not list exactly the uploaded packages and digests |
metadata.name_missing | Medium | Reject | Enforced | The manifest has no zh-CN name |
metadata.no_packages | High | Reject | Enforced | An external_https version has no platform package |
metadata.platform_invalid | Medium | Reject | Enforced | A platform name is malformed or repeated |
metadata.publisher_missing | Medium | Reject | Enforced | The manifest has no publisher id or name |
metadata.scanner_error | Medium | Quarantine (human review) | Enforced | The check itself failed (scanner fault); the version goes to human review |
metadata.skipped | Info | Record only | Enforced | A prerequisite did not complete, so this check did not run |
metadata.version_invalid | High | Reject | Enforced | The version is not canonical SemVer |
metadata.version_not_monotonic | High | Reject | Enforced | A reviewed version with the same or a higher number exists |
Entrypoint and data packages (entrypoint)
| Rule ID | Severity | Outcome | Mode | Description |
|---|---|---|---|---|
entrypoint.content_mismatch | Critical | Reject | Enforced | The uploaded data file does not match the signed spec.entrypoint.sha256 |
entrypoint.data_pack_permissions | High | Reject | Enforced | A rule_pack declares exactly security.rule_packs.provide, a theme exactly platform.themes.provide |
entrypoint.data_pack_version | High | Reject | Enforced | A data package version is plain major.minor.patch (no pre-release) |
entrypoint.packages_present | High | Reject | Enforced | A rule_pack / theme version carries executable packages |
entrypoint.provides_invalid | High | Reject | Enforced | spec.provides is malformed, repeated, or declared by a data package / ui_page |
entrypoint.provides_official_only | Critical | Reject | Enforced | This provider kind is official only (third-party CDN adapters are not open) |
entrypoint.scanner_error | Medium | Quarantine (human review) | Enforced | The check itself failed (scanner fault); the version goes to human review |
entrypoint.skipped | Info | Record only | Enforced | A prerequisite did not complete, so this check did not run |
entrypoint.type_invalid | High | Reject | Enforced | spec.entrypoint.type is not external_https, rule_pack, theme or ui_page, or does not match the plugin kind |
Permissions (permissions)
| Rule ID | Severity | Outcome | Mode | Description |
|---|---|---|---|---|
permissions.expanded | Medium | Record only | Enforced | Permissions grew since the last reviewed version: human review required |
permissions.first_version | Info | Record only | Enforced | First version of the plugin: human review required |
permissions.invalid_name | High | Reject | Enforced | A permission name is malformed or repeated, or there are more than 64 |
permissions.manifest_mismatch | High | Reject | Enforced | Stored permissions differ from the manifest |
permissions.privileged | Info | Record only | Enforced | Privileged kind (module, engine_module, provider): human review required |
permissions.reduced | Info | Record only | Enforced | Permissions shrank since the last reviewed version: human review required |
permissions.scanner_error | Medium | Quarantine (human review) | Enforced | The check itself failed (scanner fault); the version goes to human review |
permissions.skipped | Info | Record only | Enforced | A prerequisite did not complete, so this check did not run |
Rule packs (rulepack)
| Rule ID | Severity | Outcome | Mode | Description |
|---|---|---|---|---|
rulepack.budget_exceeded | High | Reject | Enforced | The rule pack exceeds the rule count, regex or per-request cost budget |
rulepack.compile_failed | High | Reject | Enforced | The rule pack does not compile (cdnca.rule-pack/v1) |
rulepack.gate_failed | High | Reject | Enforced | Fails the publication gate: does not resolve alone, or a modsecurity pack’s CRS rule numbers cannot be computed |
rulepack.layer_invalid | High | Reject | Enforced | A market rule pack must be a developer-layer pack in the publisher namespace (dev/<publisher>/<name>) |
rulepack.not_canonical | Medium | Reject | Enforced | The rule pack file is not the compiler’s canonical bytes |
rulepack.scanner_error | Medium | Quarantine (human review) | Enforced | The check itself failed (scanner fault); the version goes to human review |
rulepack.skipped | Info | Record only | Enforced | A prerequisite did not complete, so this check did not run |
rulepack.summary | Info | Record only | Enforced | What the rule pack contains (display only) |
rulepack.version_mismatch | High | Reject | Enforced | The rule pack version differs from the plugin version |
Themes (theme)
| Rule ID | Severity | Outcome | Mode | Description |
|---|---|---|---|---|
theme.admin_scope | Critical | Reject | Enforced | A third-party theme declares the administrator console (applies_to admin, admin tokens or an admin selector); only the official publisher io.cdnca may |
theme.console_invalid | High | Reject | Enforced | The console_theme of a website theme package is not a valid cdnca.theme/v1 package |
theme.id_mismatch | High | Reject | Enforced | A market theme id must be market.<plugin id> |
theme.invalid | High | Reject | Enforced | Not a valid cdnca.theme/v1 package (tokens, slots, templates, external references) |
theme.scanner_error | Medium | Quarantine (human review) | Enforced | The check itself failed (scanner fault); the version goes to human review |
theme.site_invalid | High | Reject | Enforced | Not a valid cdnca.site-theme/v1 or v2 website theme package (page bundle paths and forbidden content, auth style, content schema, applies_to) |
theme.skipped | Info | Record only | Enforced | A prerequisite did not complete, so this check did not run |
theme.summary | Info | Record only | Enforced | What the theme renders (display only) |
theme.version_mismatch | High | Reject | Enforced | The theme version differs from the plugin version |
Page plugins (ui_page)
| Rule ID | Severity | Outcome | Mode | Description |
|---|---|---|---|---|
ui_page.artifacts_present | High | Reject | Enforced | A ui_page version carries no package or data file (its pages live on your origin) |
ui_page.declaration_invalid | High | Reject | Enforced | The ui_page declaration is malformed (origin, pages, mounts, menu parents, titles, gates) |
ui_page.origin_unverified | Critical | Reject | Enforced | A page origin or api_base_url is not one you verified on the market |
ui_page.permission_missing | High | Reject | Enforced | A ui_page plugin must declare platform.ui_pages.provide |
ui_page.scanner_error | Medium | Quarantine (human review) | Enforced | The check itself failed (scanner fault); the version goes to human review |
ui_page.skipped | Info | Record only | Enforced | A prerequisite did not complete, so this check did not run |
ui_page.summary | Info | Record only | Enforced | Where the pages are mounted (display only) |
Platform packages (package)
| Rule ID | Severity | Outcome | Mode | Description |
|---|---|---|---|---|
package.blocked_file | Critical | Reject | Enforced | A file hash is on the platform block list |
package.corrupt | High | Reject | Enforced | The archive is corrupt |
package.digest_mismatch | Critical | Reject | Enforced | A stored package does not match its declared SHA-256 or size |
package.duplicate_entry | High | Reject | Enforced | Contains duplicate entry names |
package.limits_exceeded | High | Reject | Enforced | Over the entry count or unpacked size limits |
package.path_traversal | Critical | Reject | Enforced | An entry name escapes the package root |
package.scanner_error | Medium | Quarantine (human review) | Enforced | The check itself failed (scanner fault); the version goes to human review |
package.setuid | High | Quarantine (human review) | Enforced | An entry has the setuid or setgid bit |
package.skipped | Info | Record only | Enforced | A prerequisite did not complete, so this check did not run |
package.special_file | High | Reject | Enforced | Contains a device, pipe or socket |
package.symlink | High | Reject | Enforced | Contains a symbolic or hard link |
package.unknown_format | High | Reject | Enforced | A package is not zip, tar.gz or tar |
package.unsupported_entry | Medium | Reject | Enforced | Unsupported archive entry type |
package.zip_bomb | Critical | Reject | Enforced | It expands far beyond its compressed size (zip bomb) |
Leaked secrets (secrets)
| Rule ID | Severity | Outcome | Mode | Description |
|---|---|---|---|---|
secrets.alibaba_access_key | High | Reject | Enforced | Alibaba Cloud AccessKey ID |
secrets.aws_access_key | Critical | Reject | Enforced | AWS access key ID |
secrets.gcp_api_key | High | Reject | Enforced | Google API key |
secrets.generic_api_key | Medium | Quarantine (human review) | Evaluation (recorded only) | Generic credential assignment (api_key, secret, token, password and so on) |
secrets.github_fine_grained_pat | Critical | Reject | Enforced | GitHub fine-grained token |
secrets.github_token | Critical | Reject | Enforced | GitHub token |
secrets.gitlab_pat | Critical | Reject | Enforced | GitLab personal access token |
secrets.jwt | Medium | Quarantine (human review) | Evaluation (recorded only) | JSON Web Token |
secrets.private_key | Critical | Reject | Enforced | A private key is embedded in the package |
secrets.scanner_error | Medium | Quarantine (human review) | Enforced | The check itself failed (scanner fault); the version goes to human review |
secrets.skipped | Info | Record only | Enforced | A prerequisite did not complete, so this check did not run |
secrets.slack_token | High | Reject | Enforced | Slack token |
secrets.slack_webhook | High | Reject | Enforced | Slack webhook URL |
secrets.stripe_secret_key | High | Reject | Enforced | Stripe secret key |
secrets.tencent_secret_id | High | Reject | Enforced | Tencent Cloud SecretId |
Dependencies (dependencies)
| Rule ID | Severity | Outcome | Mode | Description |
|---|---|---|---|---|
dependencies.inventory | Info | Record only | Enforced | Third-party components found (display only) |
dependencies.malicious | Critical | Reject | Enforced | A dependency is a known malicious package |
dependencies.not_configured | Info | Record only | Enforced | The OSV offline database is not configured; dependency scan skipped (notice only) |
dependencies.scanner_error | Medium | Quarantine (human review) | Enforced | The check itself failed (scanner fault); the version goes to human review |
dependencies.skipped | Info | Record only | Enforced | A prerequisite did not complete, so this check did not run |
dependencies.vulnerable | Low | Record only | Enforced | A dependency has a known vulnerability (notice only) |
dependencies.vulnerable_high | High | Quarantine (human review) | Evaluation (recorded only) | A dependency has a high or critical vulnerability |
Malware scan (malware)
| Rule ID | Severity | Outcome | Mode | Description |
|---|---|---|---|---|
malware.detected | Critical | Reject | Enforced | clamd detected malware |
malware.not_configured | Info | Record only | Enforced | clamd is not configured; virus scan skipped (notice only) |
malware.scanner_error | Medium | Quarantine (human review) | Enforced | The check itself failed (scanner fault); the version goes to human review |
malware.skipped | Info | Record only | Enforced | A prerequisite did not complete, so this check did not run |
Version diff (diff)
| Rule ID | Severity | Outcome | Mode | Description |
|---|---|---|---|---|
diff.binary_changed | Low | Record only | Enforced | An executable was added or changed (notice only) |
diff.first_version | Info | Record only | Enforced | No earlier reviewed version to compare with (display only) |
diff.scanner_error | Medium | Quarantine (human review) | Enforced | The check itself failed (scanner fault); the version goes to human review |
diff.skipped | Info | Record only | Enforced | A prerequisite did not complete, so this check did not run |
diff.summary | Info | Record only | Enforced | Changes since the last reviewed version (display only) |