Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

CLI_CONTRACT.md documents status paidRequired for get and scan, but get emits "paid_required" and scan never reports it

未关闭 适合新手
#982 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
74/100
Issue 类型
文档
描述清晰度
描述清楚
活跃度
活跃
技术栈
rust
领域
cli, documentation

调研方向

阅读 CLI_CONTRACT.md 中第 1092 行和第 1163 行附近的内容,然后与 crates/socket-patch-cli/src/commands/get.rs 中两处手写的 paid JSON 代码块(L2894-L2905 和位于 L3179-L3215 的 report_paid_required_uuid)以及 scan/mod.rs 中的 select_accessible 进行比较。重写契约中的 paid_required 行和 status 枚举,使其与实际输出的内容一致,可选择在 get.rs 中提取一个共享的 emitter,并使用 cargo test -p socket-patch-cli --test get paid 验证(4 个测试必须保持通过)。完成标准是契约与输出的 JSON 相符,并且一个以 contract_gradle_codes.rs 为范本的新契约解析测试断言 status 的拼写。

由索引模型根据 Issue 内容生成。

描述

agent:triaged arch-audit bug priority:p3

[agent] Filed by the scheduled architecture audit routine (CLI and core). Register: discussion #560 register.

Kind: bug (contract drift). Source: new finding; register C54.

Problem (main @ 9c43dfc)

CLI_CONTRACT.md documents a paid-plan refusal that no command emits, and doesn't document the one that get does emit.

  • What the contract says. The envelope's status enum lists "paidRequired". The errorCode table row paid_required says: action failed, status=paidRequired, emitted by "get/scan".

  • What get emits. Both paid paths hand-write a legacy object with a snake_case status and no events or errorCode:

    Both print {"status":"paid_required","found":N,"downloaded":0,"applied":0,"patches":[…]} and exit 0.

  • What scan emits. Nothing paid-specific. It drops inaccessible patches in select_accessible and reports them only as the paidPatches / canAccessPaidPatches counts.``

  • Status::PaidRequired is never constructed. The variant is referenced only by tests below #[cfg(test)] (L481). Its own doc comment already says "Nothing emits it yet (get reports this via its legacy status: "paid_required" shape; scan never does)". So the code knows; the contract was never updated.

Proof by execution. On 9c43dfc, cargo test -p socket-patch-cli --test get paid ran twice: 4 passed both times. Those tests pin status == "paid_required" and exit 0 for both get paths: get_edge_cases_e2e.rs#L241-L287 and get_invariants.rs#L439-L490.`` A consumer that follows the contract and matches status == "paidRequired" or `errorCode == "paid_required"` never matches.

Symptoms

None filed. PR bots that implement the documented "upgrade your plan" branch silently never take it.

Impact

Small and user-visible: the documented machine contract for the paid tier is wrong in three ways (status spelling, action/errorCode, and the command list). It's another instance of C13/C33: the contract's code tables aren't checked against the code.

Proposed change

Make the contract describe what ships. No behavior change.

  • Rewrite the paid_required row (L1163): get only; legacy top-level status: "paid_required" with found/downloaded/applied/patches[], exit 0, no events/errorCode. Keep the existing get <uuid> proxy sentence, which is accurate.
  • State that scan reports paid patches only through paidPatches and canAccessPaidPatches.
  • In the status enum (L1092), mark paidRequired as reserved, or remove it. Deleting Status::PaidRequired and its two test references is optional and belongs with this change if it is removed.
  • Route the two hand-written get JSON blocks through one helper so the shape is written once.

Moving get onto the unified envelope (where paidRequired would become real) is the owner decision in #704 and is out of scope here.

Size and scope

CLI_CONTRACT.md (two lines), get.rs (one shared ~20-line emitter replacing two blocks), and optionally json_envelope.rs (−6 lines). Under 60 changed lines.

Acceptance criteria

  • The contract's paid_required row and status enum match the emitted JSON.
  • get's two paid JSON blocks share one emitter.
  • The 4 --test get paid tests stay green.
  • Add a test that reads the contract's paid_required row and asserts the status spelling get emits, in the style of contract_gradle_codes.rs.

Dependencies

  • Independent of #704; if #704 later moves get onto the envelope, that PR updates this row again.
  • Feeds #948 (checked contract reference) and #930 (typed error codes).
主要语言
Rust
星标
8
派生
0
平均合并
1 天 1 小时
30 天内合并 PR
257

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

SocketDev/socket-patch 的其他 Issue

查看 SocketDev/socket-patch 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。