Skip to content

parseDumpChatToMarkdownArgs default 5000 bypasses validateMaxMessagesCap (latent invariant) #23

@kiki830621

Description

@kiki830621

Problem

From verification of #8/#11/#12 by devils-advocate (MEDIUM):
parseDumpChatToMarkdownArgs 預設 5000 失去 cap-check(隱形 invariant 變更)。
舊:let maxMessages = args["max_messages"]?.intValue ?? 5000; try validateMaxMessagesCap(maxMessages) ← 對所有 path(含 default)跑 cap
新:let maxMessages = try parseMaxMessages(args) ?? 5000 ← default 5000 跳過 cap

因 5000 < 10_000,外部行為等價;但若未來把 cap policy 改成 1_000(為了 paid-tier 限額),新使用者打 dump_chat_to_markdown 不傳 max_messages 會 silently 拉 5_000 條(超過新 cap)。

validateMaxMessagesCap 的 comment 自承「Single source of truth so a future cap policy change... propagates atomically」— 但現在 default 路徑已經繞過這個 single source。」
— Source: team:devils-advocate (logic-reviewer LOW informational also)

Type

bug (latent invariant violation)

Expected

加 belt-and-suspenders cap-check:

let maxMessages = try parseMaxMessages(args) ?? 5000
try validateMaxMessagesCap(maxMessages)

或(更好):把 default 變參數傳給 helper,讓 helper 對 default 路徑也做 cap:

internal func parseMaxMessages(_ args: [String: Value], default: Int? = nil) throws -> Int? {
    if let raw = args["max_messages"] {
        // explicit path — coerce + cap
        ...
    }
    if let defaultValue = `default` {
        try validateMaxMessagesCap(defaultValue)
        return defaultValue
    }
    return nil
}

Acceptance

  • parseDumpChatToMarkdownArgs default 5000 path runs through validateMaxMessagesCap
  • Add test: temporarily change cap to 1000 in test fixture, verify dump default 5000 throws
  • CHANGELOG entry under [Unreleased] Fixed section

Code Reference

  • Sources/CheTelegramAllMCPCore/HandlerArgs.swift:98 (default 5000 in parseDumpChatToMarkdownArgs)
  • Sources/CheTelegramAllMCPCore/HandlerArgs.swift:120 (validateMaxMessagesCap doc claim)

Related: #8, #13

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions